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).
Lesi isihloko sesibili mayelana ne-blockchain yemboni, eyokuqala
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:
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:
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:
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