Magadzirirwo andakaita mabhuraki uye kutengeserana mune yangu Go blockchain

Kuti pakupedzisira tigadzire blockchain uye kwete dhatabhesi chete, isu tinofanirwa kuwedzera zvinhu zvitatu zvakakosha kupurojekiti yedu:

  • Tsanangudzo ye data data uye nzira dze block
  • Tsanangudzo yechimiro chedata uye nzira dzekutengesa
  • Blockchain mabasa anochengeta zvidhinha mudhatabhesi uye wozviwana ipapo nehashi yavo kana kureba (kana imwe nzira).

Magadzirirwo andakaita mabhuraki uye kutengeserana mune yangu Go blockchain

Ichi ndicho chinyorwa chechipiri nezve blockchain yeindasitiri, yekutanga pano.

Ndichirangarira mibvunzo yakabvunzwa nevaverengi nezve chinyorwa chakapfuura mune ino nhevedzano, zvakakosha kuziva: LevelDB inoshandiswa kuchengetedza blockchain data mune iyi kesi, asi hapana chinokumisa kubva kushandisa chero imwe dhatabhesi, seMySQL. Zvino ngatitarisei chimiro che data iyi.

Ngatitange nekutengesa: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Heino data rayo chimiro:

type TX struct {
	DataType byte		
	TxHash string 
	TxType byte	
	Timestamp int64		
	INs []TxIn
	OUTs []TxOut
}

type TxIn struct {
	ThatTxHash string
	TxOutN int
	ByteCode string
}

type TxOut struct {
	Value int
	ByteCode string
}

TX inochengetedza rudzi rwe data (yekutengeserana 2), iyo transaction hashi, iyo yekutengeserana mhando pachayo, chitambi chenguva, pamwe nezvinopinza uye zvinobuda. TxIn inopinza inochengeta hashi yeinotaridzirwa transaction inobuda, nhamba yekubuda, uye bytecode, nepo TxOut zvinobuda zvichichengeta kukosha uyezve bytecode.

Iye zvino ngatitarisei zviito izvo kutengeserana kunogona kuita pane yayo data, i.e., ngationgororei nzira.

Kuti ugadzire kutengeserana, shandisa basa rekutengeserana.NewTransaction(txtype byte) *TX.

Iyo AddTxIn(thattxhash[]byte, txoutn int, kodhi[]byte)(*TxIn, kukanganisa) nzira inowedzera inopinza mukutengeserana.

Iyo AddTxOut(value int, data []byte) (* TxOut, kukanganisa) nzira inowedzera inobuda kune kutengeserana.

Iyo ToBytes()[]byte nzira inoshandura kutengeserana kuita chidimbu chebyte.

Iyo yemukati basa preByteHash(bytes []byte) tambo inoshandiswa muBuild() uye Tarisa() kuita kuti inogadzirwa transaction hashi ienderane netransaction hashes inogadzirwa kubva kuJavaScript application.

Iyo Build() nzira inoseta kutengeserana hashi sezvinotevera: tx.TxHash = preByteHash(tx.ToBytes()).

Iyo ToJSON () tambo nzira inoshandura kutengeserana kuita JSON tambo.

Iyo FromJSON(data []byte) kukanganisa nzira inotakura transaction kubva kuJSON fomati yakapfuura sebyte slice.

Iyo Cheki() bool nzira inofananidza iyo hashi inoguma kubva kumunda wekutengesa hashi nehashi yakawanikwa nehashi iyi kutengeserana (kusanganisa iyo hashi munda).

Transactions inowedzerwa kune block: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Iyo block data chimiro chakanyanya kuvhurika:

type Block struct {
	DataType byte				
	BlockHeight int					
        Timestamp int64				 
        HeaderSize int					
        PrevBlockHash string				 
        SelfBlockHash string			
	TxsHash string			
	MerkleRoot string
	CreatorPublicKey string			
	CreatorSig string
	Version int
	TxsN int
	Txs []transaction.TX
}

DataType inochengetedza rudzi rwe data, iyo node inoshandisa kusiyanisa block kubva kune kutengeserana kana imwe data. Kubhuroka, kukosha uku ndi1.

BlockHeight inochengetedza kureba kwebhuroka.
Chitambi chenguva.
HeaderSize ndiyo saizi yebhuroka mumabhayiti.
PrevBlockHash ndiyo hashi yeblock yapfuura, uye SelfBlockHash ndiyo hashi yebhuroko razvino.
TxsHash ndiyo yakagovaniswa kutengeserana hashi.
MerkleRoot ndiwo mudzi wemuti weMerkle.

Aya minda anotevera ane kiyi yeruzhinji yemusiki, siginecha yemugadziri, vhezheni yebhuroka, nhamba yekutengeserana mubhuroka, uye mabatiro acho pachawo.

Ngatitarisei nzira dzake:
Kugadzira bhuroka, shandisa block.NewBlock() basa: NewBlock(prevBlockHash tambo, urefu int) *Block, iyo inogamuchira hashi yebhuroko rapfuura uye kureba kwakaiswa kwechivharo chakasikwa mu blockchain. Iyo block type inotsanangurwa zvakare kubva kumhando dzepakeji nguva dzose:

b.DataType = types.BLOCK_TYPE.

Iyo AddTx(tx *transaction.TX) nzira inowedzera kutengeserana kune block.

Iyo Build () nzira inoremedza kukosha muminda yeblock uye inogadzira uye inoseta hashi yayo iripo.

Iyo ToBytesHeader()[]byte nzira inoshandura musoro weblock (pasina kutengeserana) kuita chidimbu chebyte.

Iyo ToJSON () tambo nzira inoshandura bhuroka kuita JSON fomati mukumiririra tambo yedata.

Iyo FromJSON(data []byte) yekukanganisa nzira inotakura data kubva kuJSON kuita mubhuroka chimiro.

Iyo Cheki () bool nzira inogadzira block hash uye inoienzanisa neinotsanangurwa mu block hash field.

Iyo GetTxsHash () tambo nzira inodzosa iyo yakazara hashi yezvese kutengeserana mubhuroka.

Iyo GetMerkleRoot () nzira inoisa mudzi weMerkle muti wekutengesa mubhuroka.

Iyo Sign(privk tambo) nzira inosaina bhuroko nekiyi yakavanzika yemugadziri.

Iyo SetHeight (kureba int) nzira inonyora iyo block urefu kune iyo block chimiro ndima.

Iyo GetHeight () int nzira inodzosa kureba kwechivharo sezvakatsanangurwa mumunda unoenderana weiyo block chimiro.

Iyo ToGOBBytes() []byte nzira inoisa bhuroko muGOB fomati uye inoidzosera sechidimbu chebyte.

Iyo FromGOBBytes(data []byte) nzira yekukanganisa inonyora block data kune block chimiro kubva pane yakapfuura GOB-yakarongwa byte slice.

Iyo GetHash () tambo nzira inodzosa iyo hashi ye block yakapihwa.

Iyo GetPrevHash () tambo nzira inodzosera iyo hashi yeyakapfuura block.

Iyo SetPublicKey(pubk tambo) nzira inonyora kiyi yeruzhinji yemugadziri we block kune block.

Saka, tichishandisa nzira dzeBlock chinhu, tinogona kuishandura zviri nyore kuita fomati yekutapurirana pamusoro petiweki uye nekuichengeta kune LevelDB dhatabhesi.

Aya anotevera mabasa eiyo blockchain package ane basa rekuchengetedza kune blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Kuti uite izvi, iyo block inofanirwa kuita iyo IBlock interface:

type IGOBBytes interface {
	ToGOBBytes() []byte
	FromGOBBytes(data []byte) error
}

type IBlock interface {
	IGOBBytes
	GetHash() string
	GetPrevHash() string
	GetHeight() int
	Check() bool

}

Iyo dhatabhesi yekubatanidza inogadzirwa kamwe kana iyo package yatangwa muinit () basa:

db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).

CloseDB() is a wrapper ye db.Cloce() - inodanwa mushure mekushanda nemapasuru mabasa kuvhara kubatana kune database.

Iyo SetTargetBlockHash(hash string) kukanganisa basa inonyora hashi yebhuroko iripo kudhatabhesi nekiyi inotsanangurwa neBLOCK_HASH nguva dzose.

Iyo GetTargetBlockHash() basa (tambo, kukanganisa) inodzosa hashi yebhuroko razvino rakachengetwa mudhatabhesi.

Iyo SetTargetBlockHeight(kureba int) kukanganisa basa inonyora kukosha kwe blockchain kureba kune dhatabhesi yenodhi ine kiyi inotsanangurwa neBLOCK_HEIGHT nguva dzose.

Iyo GetTargetBlockHeight () (int, kukanganisa) basa rinodzosera kureba kweblockchain kune node yakapihwa, yakachengetwa mudhatabhesi.

Iyo CheckBlock (block IBlock) bool basa inotarisa chivharo kuti charongeka isati yawedzera iyo block kune blockchain.

Iyo AddBlock (block IBlock) kukanganisa basa inowedzera bhuroka ku blockchain.

Iwo mabasa ekudzoreredza uye ekuona zvidhinha ari muexplore.go faira re blockchain package:

The GetBlockByHash(hash string) (* block.Block, error) basa rinogadzira chinhu chisina chinhu, chinotakura chivharo kubva mudhatabhesi iro hashi inopfuudzwa kwairi, uye inodzorera pointer kwairi.

Kusikwa kweiyo genesis block kunoitwa neGenesis () kukanganisa basa kubva kugenesis.go faira re blockchain package.

Chinyorwa chinotevera chichakurukura kubatanidza vatengi kune node uchishandisa iyo WebSocket mechanism.

Source: www.habr.com

Tenga inovimbika yekutambira kwemasaiti ane DDoS dziviriro, VPS VDS maseva 🔥 Tenga webhusaiti yakavimbika ine dziviriro yeDDoS, maseva eVPS VDS | ProHoster