Indlela endiyilwe ngayo iibhloko kunye nentengiselwano kwi-Go blockchain yam

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).

Indlela endiyilwe ngayo iibhloko kunye nentengiselwano kwi-Go blockchain yam

Eli linqaku lesibini malunga ne-blockchain yeshishini, eyokuqala apha.

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: 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 (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: github.com/Rusldv/bcstartup/blob/master/block/builder.go

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: github.com/Rusldv/bcstartup/tree/master/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

Yongeza izimvo