Magadzirirwo andakaita mabhuraki uye kutengeserana mune yangu Go blockchain

Kuti tizopedzisira tave ne blockchain uye kwete dhatabhesi chete, isu tinofanirwa kuwedzera zvinhu zvitatu zvakakosha kuprojekiti yedu:

  • Tsanangudzo ye block data chimiro uye nzira
  • Tsanangudzo yemaitiro e data uye nzira dzekutengesa
  • Blockchain mabasa anochengetedza zvidhinha mudhatabhesi uye wozviwana ipapo nehashi yavo kana kureba (kana chimwe chinhu).

Magadzirirwo andakaita mabhuraki uye kutengeserana mune yangu Go blockchain

Ichi ndicho chinyorwa chechipiri nezve blockchain yeindasitiri, yekutanga pano.

Kurangarira mibvunzo iyo vaverengi vakandibvunza nezve chinyorwa chakapfuura mune ino nhevedzano, zvinofanirwa kucherechedzwa: mune iyi nyaya, iyo LevelDB dhatabhesi inoshandiswa kuchengetedza blockchain data, asi hapana chinokutadzisa kushandisa chero imwe, taura, MySQL. 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), hashi yekutengeserana ikoko, mhando yekutengeserana pachayo, chitambi chenguva, uye zvinopinda uye zvinobuda. TxIn inopinza inochengeta hashi yekutengeserana iyo inobuda inoratidzwa, nhamba yeichi chinobuda uye bytecode, uye TxOut zvinobuda zvinochengeta humwe kukosha uye zvakare bytecode.

Zvino ngationei kuti ndezvipi zviito zvinogona kuitwa nekutengeserana pane data rayo, i.e. Ngatitarisei nzira.

Kuti ugadzire kutengeserana, shandisa transaction.NewTransaction(txtype byte) *TX function.

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) nzira yekukanganisa inotakura kutengeserana kubva kuJSON fomati yakapfuura sebyte slice.

Iyo Cheki () bool nzira inofananidza iyo hashi inokonzeresa kubva kumunda wekutengesa hashi nehashi yakawanikwa semhedzisiro yekumhanyisa kutengeserana uku (kuregeredza 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, node inoishandisa uye inosiyanisa bhuroka kubva kune kutengeserana kana imwe data. Kubhuroka kukosha uku ndi1.

BlockHeight inochengetedza kureba kwechivharo.
Chitambi chenguva.
HeaderSize ndiyo saizi yebhuroka mumabhayiti.
PrevBlockHash ndiyo hashi yeblock yapfuura, uye SelfBlockHash ndiyo hashi yeizvino.
TxsHash izere hashi yekutengeserana.
MerkleRoot ndiwo mudzi wemuti weMerkle.

Kupfuurirazve muminda kune kiyi yeruzhinji yemusiki weiyo block, siginecha yemugadziri, iyo vhezheni yebhuroka, nhamba yekutengeserana mubhuroka, uye izvi kutengeserana pachavo.

Ngatitarisei nzira dzayo:
Kugadzira bhuroko, shandisa block.NewBlock() basa: NewBlock(prevBlockHash tambo, urefu int) *Block, iyo inotora hashi yebhuroko rapfuura uye kureba kwakaiswa kwechivharo chakasikwa mu blockchain. Iyo block type inoiswawo kubva kumhando pasuru 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 iyo block header (isina kutengeserana) kuita chidimbu chebyte.

Iyo ToJSON () tambo nzira inoshandura iyo block kuita JSON fomati mune tambo inomiririra 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 inotsanangura mudzi weMerkle muti wekutengesa mubhuroka.

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

Iyo SetHeight (kureba int) nzira inonyora hurefu hwechivharo 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 byte slice muGOB fomati.

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

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 kuchengetedza kune LevelDB dhatabhesi.

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 nemabasa epasuru yekuvhara kubatana kune database.

Iyo SetTargetBlockHash(hash string) error function inonyora hashi yebhuroko razvino nekiyi inotsanangurwa neBLOCK_HASH yenguva dzose kune database.

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

Iyo SetTargetBlockHeight(kureba int) kukanganisa basa inonyora kudhatabhesi kukosha kweiyo blockchain kureba kwenode ine kiyi inotsanangurwa neBLOCK_HEIGHT nguva dzose.

Iyo GetTargetBlockHeight () (int, kukanganisa) basa rinodzosera hurefu hwe blockchain kune yakapihwa node, yakachengetwa mudhatabhesi.

Iyo CheckBlock (block IBlock) bool basa inotarisa bhuroka kuti ichokwadi here isati yawedzera iyi block ku 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 mukati machiri kubva mudhatabhesi, iyo hashi yakapfuudzwa kwairi, uye inodzorera pointer kwairi.

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

Chinyorwa chinotevera chichataura nezve kubatanidza vatengi kune node uchishandisa iyo WebSocket mechanism.

Source: www.habr.com

Voeg