Ngiwaklame kanjani amabhulokhi kanye nokuthengiselana ku-Go blockchain yami

Ukuze ekugcineni sigcine sine-blockchain hhayi nje isizindalwazi, sidinga ukungeza izici ezibalulekile ezi-3 kuphrojekthi yethu:

  • Incazelo yesakhiwo sedatha vimba nezindlela
  • Incazelo yesakhiwo sedatha nezindlela zokusebenza
  • Imisebenzi yeBlockchain egcina amabhlogo kusizindalwazi futhi iwathole lapho nge-hashi yawo noma ubude (noma enye into).

Ngiwaklame kanjani amabhulokhi kanye nokuthengiselana ku-Go blockchain yami

Lesi isihloko sesibili mayelana ne-blockchain yemboni, eyokuqala lapha.

Ukukhumbula imibuzo abafundi abangibuze yona mayelana nesihloko esandulele kulolu chungechunge, kufanele kuqashelwe: kulokhu, i-Database ye-LevelDB isetshenziselwa ukugcina idatha ye-blockchain, kodwa akukho okukuvimbela ukuthi usebenzise noma iyiphi enye, ithi, i-MySQL. Manje ake sibheke ukwakheka kwale datha.

Ake siqale ngokuthengiselana: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Nasi isakhiwo sayo sedatha:

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
}

I-TX igcina uhlobo lwedatha (yomsebenzi 2), i-hashi yalokho okwenziwayo, uhlobo lomsebenzi ngokwawo, isitembu sesikhathi, nokokufaka nokuphumayo. Okokufaka kwe-TxIn kugcina i-hashi yomsebenzi okukhiphayo okubaluliwe, inombolo yalokhu okukhiphayo ne-bytecode, futhi okuphumayo kwe-TxOut kugcina inani elithile kanye ne-bytecode.

Manje ake sibone ukuthi yiziphi izenzo ezingenziwa kudatha yakhona, i.e. Ake sibheke izindlela.

Ukuze udale okwenziwayo, sebenzisa umsebenzi.NewTransaction(txtype byte) *TX function.

Indlela ye-AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) yengeza okokufaka ekwenziweni.

Indlela ye-AddTxOut(value int, data []byte) (*TxOut, error) yengeza okukhiphayo ekwenziweni.

Indlela ye-ToBytes() []byte ishintsha umsebenzi ube ucezu lwebhayithi.

Umsebenzi wangaphakathi othi preByteHash(amabhayithi []bhayithi) iyunithi yezinhlamvu isetshenziswa kokuthi Build() kanye nokuthi Hlola() ukuze kwenziwe i-hashi yokwenziwe ekhiqiziwe ihambisane namahashi omsebenzi akhiqizwe ezinhlelweni zokusebenza ze-JavaScript.

Indlela Yakha() isetha i-hashi yomsebenzi ngendlela elandelayo: tx.TxHash = preByteHash(tx.ToBytes()).

Indlela yeyunithi yezinhlamvu ye-ToJSON() iguqula umsebenzi ube uchungechunge lwe-JSON.

Indlela yephutha ye-FromJSON(idatha []byte) ilayisha umsebenzi osuka kufomethi ye-JSON ephasiswe njengocezu lwebhayithi.

I-Check() indlela ye-bool iqhathanisa i-hashi ewumphumela evela kunkambu ye-hashi yomsebenzi kanye ne-hashi etholwe ngenxa yokusheshisa lokhu kuthenga (ukuziba inkambu ye-hashi).

Okwenziwayo kwengezwa kubhulokhi: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Isakhiwo sedatha ye-block sinamandla kakhulu:

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
}

I-DataType igcina uhlobo lwedatha, i-node iyayisebenzisa futhi ihlukanise ibhulokhi kuthengiselwano noma enye idatha. Ngebhulokhi leli nani lingu-1.

I-BlockHeight igcina ukuphakama kwebhulokhi.
Isitembu sesikhathi sesitembu.
IHeaderSize ingusayizi webhulokhi ngamabhayithi.
I-PrevBlockHash iyi-hashi yebhulokhi yangaphambilini, futhi i-SelfBlockHash iyi-hashi yale yamanje.
I-TxsHash iyi-hashi evamile yokwenziwayo.
I-MerkleRoot iyimpande yesihlahla se-Merkle.

Ngokuqhubekayo emasimini kukhona ukhiye womphakathi womdali we-block, isignesha yomdali, inguqulo ye-block, inani lokuthengiselana ku-block, kanye nalokhu kuthengiselana ngokwako.

Ake sibheke izindlela zayo:
Ukwakha ibhulokhi, sebenzisa umsebenzi we-block.NewBlock(): I-NewBlock(prevBlockHash string, height int) *Ibhulokhi, ethatha i-hashi yebhulokhi yangaphambili kanye nobude obusethwe kwebhulokhi edaliwe ku-blockchain. Uhlobo lwebhulokhi luphinde lusethwe kusukela ezinhlotsheni zephakheji ezingashintshi:

b.DataType = types.BLOCK_TYPE.

Indlela ye-AddTx(tx *transaction.TX) yengeza umsebenzi ebhulokhini.

Indlela Yakha () ilayisha amanani ezinkambini zebhulokhi futhi ikhiqize futhi isethe i-hashi yayo yamanje.

Indlela ye-ToBytesHeader() []byte iguqula unhlokweni webhulokhi (ngaphandle kokwenziwe) ube ucezu lwebhayithi.

Indlela yeyunithi yezinhlamvu ye-ToJSON() iguqula ibhulokhi ibe ifomethi ye-JSON ekumeleleni kweyunithi yezinhlamvu yedatha.

Indlela yephutha ye-FromJSON(idatha []byte) ilayisha idatha isuka ku-JSON iyise esakhiweni sebhulokhi.

I-Check() indlela ye-bool ikhiqiza i-block hash futhi iyiqhathanise naleyo eshiwo kunkambu ye-block hashi.

Indlela ye-GetTxsHash() yeyunithi yezinhlamvu ibuyisela isamba se-hashi yakho konke okwenziwayo kubhulokhi.

Indlela ye-GetMerkleRoot() icacisa impande yesihlahla se-Merkle ngokwenziwa kwebhulokhi.

Indlela ethi Sign(privk string) isayina ibhulokhi ngokhiye oyimfihlo womdali webhulokhi.

Indlela ye-SetHeight(ubude int) ibhala ukuphakama kwebhulokhi endaweni yesakhiwo sebhulokhi.

Indlela ye-GetHeight() int ibuyisela ubude bebhulokhi njengoba kucacisiwe endaweni ehambisanayo yesakhiwo sebhulokhi.

Indlela ye-ToGOBBytes() []byte ibhala ngekhodi ibhulokhi ngefomethi ye-GOB futhi iyibuyisele njengocezu lwebhayithi.

Indlela yephutha ye-FromGOBBytes(idatha []byte) ibhala idatha yebhulokhi kusakhiwo sebhulokhi isuka kusicezu se-byte esidlulisiwe ngefomethi ye-GOB.

Indlela ye-GetHash() yochungechunge ibuyisela i-hash yebhulokhi enikeziwe.

Indlela ye-GetPrevHash() yeyunithi yezinhlamvu ibuyisela i-hash yebhulokhi yangaphambilini.

Indlela ye-SetPublicKey(i-pubk string) ibhala ukhiye osesidlangalaleni womdali webhulokhi ebhulokhini.

Ngakho-ke, sisebenzisa izindlela ze-Block object, singayiguqula kalula ibe yifomethi yokudlulisela ngenethiwekhi futhi siyilondoloze ku-LevelDB database.

Imisebenzi yephakheji ye-blockchain inesibopho sokulondoloza ku-blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Ukuze wenze lokhu, ibhulokhi kufanele isebenzise isikhombimsebenzisi se-IBlock:

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

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

}

Uxhumano lwesizindalwazi lwenziwa kanye lapho iphakheji iqaliswa ku-init() umsebenzi:

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

I-CloseDB() i-wrapper ye-db.Cloce() - ebizwa ngemva kokusebenza nemisebenzi yephakheji ukuvala uxhumano kusizindalwazi.

Umsebenzi wephutha we-SetTargetBlockHash(hash string) ubhala i-hashi yebhulokhi yamanje ngokhiye oshiwo ngokungashintshi okuthi BLOCK_HASH kusizindalwazi.

Umsebenzi we-GetTargetBlockHash() (uchungechunge, iphutha) ubuyisela i-hashi yebhulokhi yamanje egcinwe kusizindalwazi.

Umsebenzi wephutha we-SetTargetBlockHeight(height int) ubhalela kusizindalwazi inani lobude be-blockchain yenodi ngokhiye oshiwo ngokungaguquki okuthi BLOCK_HEIGHT.

Umsebenzi we-GetTargetBlockHeight() (int, error) ubuyisela ubude be-blockchain yenodi enikeziwe, egcinwe kusizindalwazi.

Umsebenzi we-CheckBlock(block IBlock) we-bool uhlola ibhulokhi ukuthi ulungile yini ngaphambi kokwengeza leli bhulokhi ku-blockchain.

Umsebenzi wephutha we-AddBlock(block IBlock) wengeza ibhulokhi ku-blockchain.

Imisebenzi yokubuyisa nokubuka amabhlogo ikufayela le-explorel.go lephakheji ye-blockchain:

Umsebenzi we-GetBlockByHash(hash string) (*block.Block, error) udala into engenalutho yebhulokhi, ilayisha ibhulokhi kuyo isuka kusizindalwazi, i-hashi yayo edluliselwe kuyo, bese ibuyisela i-pointer kuyo.

Ukwakhiwa kwebhulokhi ye-genesis kwenziwa umsebenzi wephutha we-Genesis() kusuka kufayela le-genesis.go lephakheji ye-blockchain.

Isihloko esilandelayo sizokhuluma ngokuxhuma amaklayenti ku-node usebenzisa indlela yeWebSocket.

Source: www.habr.com

Engeza amazwana