Mar a dhealbhaich mi blocaichean agus gnothaichean anns an Go blockchain agam

Gus crìoch a chuir air blockchain agus chan e dìreach stòr-dàta, feumaidh sinn 3 eileamaidean cudromach a chur ris a’ phròiseact againn:

  • Tuairisgeul air structar dàta bloc agus dòighean
  • Tuairisgeul air structar dàta agus dòighean malairt
  • Gnìomhan Blockchain a shàbhaileas blocaichean ann an stòr-dàta agus a lorgar an sin leis an hash no an àirde (no rudeigin eile).

Mar a dhealbhaich mi blocaichean agus gnothaichean anns an Go blockchain agam

Is e seo an dàrna artaigil mu blockchain airson gnìomhachas, a’ chiad fhear an seo.

A 'cuimhneachadh air na ceistean a dh' fhaighnich luchd-leughaidh dhomh mun artaigil roimhe san t-sreath seo, bu chòir a thoirt fa-near: anns a 'chùis seo, tha an stòr-dàta LevelDB air a chleachdadh gus dàta blockchain a stòradh, ach chan eil dad a' cur bacadh ort bho bhith a 'cleachdadh sam bith eile, can, MySQL. A-nis leig dhuinn sùil a thoirt air structar an dàta seo.

Feuch an tòisich sinn le gnothaichean: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Seo an structar dàta aige:

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
}

Bidh TX a’ stòradh an seòrsa dàta (airson malairt 2), hash a’ ghnothaich sin, an seòrsa gnothach fhèin, clàr-ama, agus cuir a-steach agus toraidhean. Bidh cuir a-steach TxIn a’ stòradh hash a’ ghnothaich air a bheil iomradh air a thoirt a-mach, àireamh an toraidh seo agus bytecode, agus bidh toraidhean TxOut a’ stòradh beagan luach agus cuideachd còd byte.

A-nis chì sinn dè na gnìomhan as urrainn do ghnothach a dhèanamh air an dàta aige, i.e. Bheir sinn sùil air na dòighean-obrach.

Gus malairt a chruthachadh, cleachd an gnìomh malairt.NewTransaction(txtype byte) *TX.

Tha an dòigh AddTxIn (thattxhash [] byte, txoutn int, code [] byte) (* TxIn, mearachd) a 'cur a-steach don ghnothach.

Tha an dòigh AddTxOut (luach int, dàta [] byte) (* TxOut, mearachd) a’ cur toradh ris a’ ghnothach.

Bidh an dòigh ToBytes() [] byte a’ tionndadh a’ ghnothaich gu sliseag byte.

Tha an sreang gnìomh a-staigh preByteHash (bytes [] byte) air a chleachdadh ann an Build () agus Check () gus am bi an hash malairt a chaidh a ghineadh co-chosmhail ri hashes malairt a chaidh a chruthachadh bho thagraidhean JavaScript.

Tha an dòigh Build() a’ suidheachadh hash a’ ghnothaich mar a leanas: tx.TxHash = preByteHash(tx.ToBytes()).

Bidh an dòigh sreang ToJSON () ag atharrachadh malairt gu sreang JSON.

Bidh am modh mearachd FromJSON (data [] byte) a’ luchdachadh malairt bhon chruth JSON a chaidh seachad mar sliseag byte.

Tha an dòigh bool Check() a’ dèanamh coimeas eadar an hash a thig às an raon hash malairt agus an hash a gheibhear mar thoradh air a’ ghnothach seo a bhualadh (a’ seachnadh an raon hash).

Tha gnothaichean air an cur ris a’ bhloc: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Tha structar dàta a’ bhloca nas toirteile:

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
}

Bidh DataType a’ stòradh an seòrsa dàta, bidh an nód ga chleachdadh agus a’ dèanamh eadar-dhealachadh air a’ bhloc bho ghnothach no dàta eile. Airson bloc tha an luach seo 1.

Bidh BlockHeight a’ stòradh àirde a’ bhloc.
Clàr-ama stampa-ama.
Is e HeaderSize meud a’ bhloca ann am bytes.
Is e PrevBlockHash hash a’ bhloc roimhe, agus is e SelfBlockHash hash an fhear a th’ ann an-dràsta.
Tha TxsHash na hash coitcheann de ghnothaichean.
Is e MerkleRoot freumh na craoibhe Merkle.

Nas fhaide anns na raointean tha iuchair phoblach neach-cruthachaidh a’ bhloc, ainm-sgrìobhte an neach-cruthachaidh, dreach a ’bhloc, an àireamh de ghnothaichean sa bhloc, agus na gnothaichean sin iad fhèin.

Bheir sinn sùil air na dòighean aige:
Gus bloc a chruthachadh, cleachd an gnìomh block.NewBlock(): NewBlock (sreang prevBlockHash, àirde int) *Bloc, a bheir hash a’ bhloca roimhe agus an àirde a chaidh a shuidheachadh airson a’ bhloc a chaidh a chruthachadh anns an blockchain. Tha an seòrsa bloc cuideachd air a shuidheachadh bhon phasgan seòrsaichean seasmhach:

b.DataType = types.BLOCK_TYPE.

Bidh an dòigh AddTx (tx * transaction.TX) a’ cur malairt ri bloc.

Bidh an dòigh Build () a’ luchdachadh luachan a-steach do raointean a’ bhloc agus a ’gineadh agus a’ suidheachadh an hash gnàthach aige.

Bidh an dòigh ToBytesHeader() [] byte ag atharrachadh bann-cinn a’ bhloca (às aonais ghnothaichean) gu sliseag byte.

Bidh an dòigh sreang ToJSON () ag atharrachadh a’ bhloca gu cruth JSON ann an riochdachadh sreang den dàta.

Tha modh mearachd FromJSON (data [] byte) a 'luchdachadh dàta bho JSON gu structar bloca.

Bidh an dòigh bool Check () a’ gineadh hash bloca agus ga choimeas ris an fhear a tha air a shònrachadh anns an raon hash bloc.

Bidh an dòigh sreang GetTxsHash() a’ tilleadh hash iomlan a h-uile gnothach sa bhloc.

Tha an dòigh GetMerkleRoot () a’ sònrachadh freumh na craoibhe Merkle airson gnothaichean ann am bloc.

Tha an dòigh Sign (privk string) a’ soidhnigeadh bloc le iuchair phrìobhaideach neach-cruthachaidh a’ bhloca.

Bidh an dòigh SetHeight (àirde int) a’ sgrìobhadh àirde a’ bhloca gu raon structar a’ bhloc.

Bidh an dòigh GetHeight () int a’ tilleadh àirde a’ bhloca mar a tha air a shònrachadh anns an raon co-fhreagarrach de structar a’ bhloc.

Bidh an dòigh ToGOBBytes() [] byte a’ còdachadh bloca ann an cruth GOB agus ga thilleadh mar sliseag byte.

Bidh modh mearachd FromGOBBytes (data [] byte) a’ sgrìobhadh dàta bloca gu structar a’ bhloca bhon t-sliseag pas byte ann an cruth GOB.

Bidh an dòigh sreang GetHash () a’ tilleadh hash a’ bhloc a chaidh a thoirt seachad.

Bidh an dòigh sreang GetPrevHash () a’ tilleadh hash a’ bhloca roimhe.

Bidh am modh SetPublicKey (pubk string) a’ sgrìobhadh iuchair phoblach neach-cruthachaidh a’ bhloca chun bhloc.

Mar sin, a’ cleachdadh dhòighean an nì Block, is urrainn dhuinn gu furasta a thionndadh gu cruth airson a chuir thairis air an lìonra agus a shàbhaladh gu stòr-dàta LevelDB.

Tha e an urra ri gnìomhan a’ phacaid blockchain sàbhaladh don blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Gus seo a dhèanamh, feumaidh am bloc eadar-aghaidh IBlock a chuir an gnìomh:

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

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

}

Tha an ceangal stòr-dàta air a chruthachadh aon uair nuair a thèid am pasgan a thòiseachadh sa ghnìomh init ():

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

Tha CloseDB() na inneal-lìonaidh airson db.Cloce() - ris an canar às deidh obrachadh leis na gnìomhan pacaid gus an ceangal ris an stòr-dàta a dhùnadh.

Bidh gnìomh mearachd SetTargetBlockHash (hash string) a’ sgrìobhadh hash a’ bhloca gnàthach leis an iuchair a tha air a shònrachadh leis a’ sheasmhach BLOCK_HASH don stòr-dàta.

Bidh an gnìomh GetTargetBlockHash () (sreang, mearachd) a’ tilleadh hash a’ bhloca gnàthach a tha air a stòradh san stòr-dàta.

Bidh gnìomh mearachd SetTargetBlockHeight (height int) a’ sgrìobhadh chun stòr-dàta luach àirde blockchain airson an nód leis an iuchair a tha air a shònrachadh leis an seasmhach BLOCK_HEIGHT.

Bidh an gnìomh GetTargetBlockHeight () (int, mearachd) a’ tilleadh àirde an blockchain airson nód sònraichte, air a stòradh san stòr-dàta.

Bidh an gnìomh bool CheckBlock (bloc IBlock) a’ sgrùdadh bloc airson ceartachd mus cuir thu am bloc seo ris an blockchain.

Bidh gnìomh mearachd AddBlock (bloc IBlock) a’ cur bloc ris an blockchain.

Tha na gnìomhan airson blocaichean fhaighinn air ais agus fhaicinn anns an fhaidhle explorer.go den phasgan blockchain:

Bidh an gnìomh GetBlockByHash (hash string) (* block.Block, mearachd) a’ cruthachadh nì bloca falamh, a’ luchdachadh bloca a-steach bhon stòr-dàta, agus chaidh an hash dheth a chuir thuige, agus a’ tilleadh puing thuige.

Tha cruthachadh bloc genesis air a dhèanamh le gnìomh mearachd Genesis () bhon fhaidhle genesis.go den phasgan blockchain.

Bruidhnidh an ath artaigil mu bhith a’ ceangal luchd-dèiligidh ri nód a’ cleachdadh inneal WebSocket.

Source: www.habr.com

Cuir beachd ann