Ukuze ekugqibeleni sigqibe nge-blockchain kwaye hayi nje i-database, kufuneka songeze izinto ezi-3 ezibalulekileyo kwiprojekthi yethu:
- Inkcazo yesakhiwo sedatha yebhloko kunye neendlela
- Inkcazo yesakhiwo sedatha kunye neendlela zokuthengiselana
- Imisebenzi yeBlockchain egcina iibhloko kwisiseko sedatha kwaye ifumane apho ngehashi okanye ubude bayo (okanye enye into).
Eli linqaku lesibini malunga ne-blockchain yeshishini, eyokuqala
Ukukhumbula imibuzo abafundi abandibuza yona malunga nenqaku elidlulileyo kolu chungechunge, kufuneka kuqatshelwe: kule meko, i-database ye-LevelDB isetyenziselwa ukugcina idatha ye-blockchain, kodwa akukho nto ikuthintela ukuba usebenzise nayiphi na enye, ithi, i-MySQL. Ngoku makhe sijonge isakhiwo sale data.
Masiqale ngeentengiselwano:
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 (yetransekshini yesi-2), i-hash yaloo ntengiselwano, udidi lwentengiselwano ngokwayo, isitampu sexesha, kunye namagalelo kunye neziphumo. Amagalelo e-TxIn agcina i-hash yentengiselwano imveliso yayo ichaziweyo, inani lale mveliso kunye ne-bytecode, kwaye iziphumo ze-TxOut zigcina ixabiso elithile kunye ne-bytecode.
Ngoku makhe sibone ukuba zeziphi izenzo intengiselwano enokuyenza kwidatha yayo, i.e. Makhe sijonge iindlela.
Ukwenza itransekshini, sebenzisa itransaction.NewTransaction(txtype byte) *umsebenzi weTX.
Indlela ye-AddTxIn(thattxhash []byte, txoutn int, ikhowudi []byte) (*TxIn, impazamo) yongeza igalelo kwintengiselwano.
I-AddTxOut(ixabiso int, idatha []byte) (*TxOut, impazamo) indlela yongeza imveliso kwintengiselwano.
I-ToBytes () []indlela ye-byte ijika intengiselwano ibe sisilayi se-byte.
Umsebenzi wangaphakathi preByteHash(bytes []byte) umtya usetyenziswa kwi-Build() kwaye Khangela () ukwenza i-hash yentengiselwano eyenziweyo ihambelane netransekshini yehashes eyenziwe kwiJavaScript izicelo.
Indlela Yakha () ibeka i-hash yentengiselwano ngolu hlobo lulandelayo: tx.TxHash = preByteHash(tx.ToBytes()).
Indlela yeToJSON () yomtya iguqulela intengiselwano kumtya we-JSON.
I-FromJSON(idatha []byte) indlela yemposiso ilayisha intengiselwano ukusuka kwifomati ye-JSON egqithiswe njenge-byte slice.
I-Check () indlela ye-bool ithelekisa i-hash enesiphumo esivela kwintsimi ye-hash yetransekshini kunye ne-hash efunyenwe njengesiphumo sokwenza le ntengiselwano (ungahoyi indawo ye-hash).
Iintengiselwano zongezwa kwibhloko:
Ubume bedatha yebhloko bunamandla ngakumbi:
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 iyisebenzisa kwaye iyahlula ibhloko kwintengiselwano okanye enye idatha. Kwibhloko eli xabiso ngu-1.
I-BlockHeight igcina ukuphakama kwebhloko.
Isitampu sexesha
IHeaderSize yisayizi yebhloko kwii-bytes.
I-PrevBlockHash yi-hash yebhloko yangaphambili, kwaye i-SelfBlockHash yi-hash yale yangoku.
I-TxsHash yi-hash jikelele yeentengiselwano.
I-MerkleRoot yingcambu yomthi we-Merkle.
Ukuqhubela phambili emasimini kukho isitshixo sikawonke-wonke somdali webhloko, isignesha yomdali, uguqulelo lwebhloko, inani leentengiselwano kwibhloko, kunye nale ntengiselwano ngokwazo.
Makhe sijonge iindlela zayo:
Ukwenza ibhloko, sebenzisa ibhloko.NewBlock() umsebenzi:I-NewBlock(prevBlockHash string, height int) *Ibhlokhi, ethatha i-hash yebhloko yangaphambili kunye nobude obusetiweyo kwibhloko eyenziweyo kwibhloko yebhloko. Uhlobo lwebhloko lukwasetwa kwiintlobo zepakethe engaguqukiyo:
b.DataType = types.BLOCK_TYPE.
Indlela ye-AddTx (tx *transaction.TX) yongeza intengiselwano kwibhloko.
Indlela Yakha () ilayisha amaxabiso kwimihlaba yebhloko kwaye ivelise kwaye icwangcise i-hash yayo yangoku.
I-ToBytesHeader () []indlela ye-byte iguqula i-header yebhloko (ngaphandle kwentengiselwano) kwisilayi se-byte.
I-ToJSON () indlela yomtya iguqulela ibhloko kwifomati ye-JSON kumboniso womtya wedatha.
I-FromJSON(idatha []byte) imposiso yendlela ilayisha idatha esuka kwi-JSON kwisakhiwo sebhloko.
I-Check () indlela ye-bool yenza i-hash yebhloko kwaye ithelekise naleyo ichaziweyo kwibala le-hash yebhloko.
Indlela ye-GetTxsHash () yomtya ibuyisela i-hash iyonke yazo zonke iintengiselwano kwibhloko.
Indlela ye-GetMerkleRoot () ikhankanya ingcambu yomthi we-Merkle ukwenzela iitransekshini kwibhloko.
Indlela yoMqondiso (umtya weprivk) ityikitya ibhloko ngeqhosha labucala lomenzi webhloko.
Indlela ye-SetHeight (ubude int) ibhala ukuphakama kwebhloko kwintsimi yesakhiwo sebhloko.
I-GetHeight () indlela ye-int ibuyisela ubude bebhloko njengoko kuchaziwe kwintsimi ehambelanayo yesakhiwo sebhloko.
I-ToGOBBytes () []indlela yebhayithi ifaka iikhowudi kwibhloko kwifomati yeGOB kwaye iyibuyisela njengesilayi se-byte.
I-FromGOBBytes(idatha []byte) indlela yemposiso ibhala idatha yebhloko kwisakhiwo sebhloko ukusuka kwisilayi se-byte esigqithisiweyo kwifomati yeGOB.
I GetHash () indlela yomtya ibuyisela i-hash yebhloko enikiweyo.
Indlela yeGetPrevHash () ibuyisela i-hash yebhloko yangaphambili.
I-SetPublicKey(umtya we-pubk) ubhala isitshixo sikawonke-wonke somenzi webhloko kwibhloko.
Ngaloo ndlela, usebenzisa iindlela zeBlock into, sinokuyiguqulela ngokulula kwifomathi yokudluliselwa kwinethiwekhi kunye nokugcina kwi-database ye-LevelDB.
Imisebenzi yephakheji ye-blockchain inoxanduva lokugcina kwi-blockchain:
Ukwenza oku, ibhloko kufuneka iphumeze ujongano lwe-IBlock:
type IGOBBytes interface {
ToGOBBytes() []byte
FromGOBBytes(data []byte) error
}
type IBlock interface {
IGOBBytes
GetHash() string
GetPrevHash() string
GetHeight() int
Check() bool
}
Uqhagamshelwano lwesiseko sedatha lwenziwa kanye xa upakisho luqaliswa kwi init() umsebenzi:
db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).
I-CloseDB () yisisongelo se-db.Cloce () - ebizwa emva kokusebenza kunye nemisebenzi yephakheji ukuvala uxhulumaniso kwisiseko sedatha.
I-SetTargetBlockHash(i-hash string) umsebenzi wemposiso ubhala i-hash yebhloko yangoku kunye nesitshixo esichazwe ngu-BLOCK_HASH rhoqo kwisiseko sedatha.
I GetTargetBlockHash () (umtya, impazamo) umsebenzi ubuyisela i-hash yebhloko yangoku egcinwe kuvimba weenkcukacha.
I-SetTargetBlockHeight(ubude int) umsebenzi wemposiso ubhala kwisiseko sedatha ixabiso lobude bebhloko ye-node ngeqhosha elichazwe ngu-BLOCK_HEIGHT rhoqo.
I GetTargetBlockHeight () (int, error) umsebenzi ubuyisela umphakamo we blockchain ye node enikiweyo, egcinwe kuvimba weenkcukacha.
Umsebenzi we-CheckBlock (ibhloko ye-IBlock) ujonga ibhloko yokuchaneka phambi kokongeza le bhloko kwi-blockchain.
I-AddBlock (i-block IBlock) impazamo umsebenzi wongeza ibhloko kwi-blockchain.
Imisebenzi yokubuyisela kunye nokujonga iibhloko kwifayile ye-explore.go ye-blockchain package:
I GetBlockByHash(umtya wehash) (*block.Block, imposiso) umsebenzi udala into engenanto ibhlokhi, ilayisha ibhloko kuyo ukusuka kugcino lwedatha, ihashi egqithiselwe kuyo, kwaye ibuyisela isalathisi kuyo.
Ukwenziwa kwebhloko ye-genesis kuqhutyelwa yiGenesis () umsebenzi wephutha ukusuka kwifayile ye-genesis.go ye-blockchain package.
Inqaku elilandelayo liza kuthetha malunga nokudibanisa abathengi kwi-node usebenzisa indlela yeWebSocket.
umthombo: www.habr.com