Ki jan mwen te fèt blòk ak tranzaksyon nan blockchain Go mwen an

Pou finalman fini ak yon blockchain epi pa sèlman yon baz done, nou bezwen ajoute 3 eleman enpòtan nan pwojè nou an:

  • Deskripsyon nan estrikti nan done blòk ak metòd
  • Deskripsyon estrikti done ak metòd tranzaksyon yo
  • Fonksyon Blockchain ki sove blòk nan yon baz done epi jwenn yo la pa hash yo oswa wotè (oswa yon lòt bagay).

Ki jan mwen te fèt blòk ak tranzaksyon nan blockchain Go mwen an

Sa a se dezyèm atik sou blockchain pou endistri, premye a isit la.

Sonje kesyon lektè yo te poze m 'sou atik anvan an nan seri sa a, li ta dwe remake: nan ka sa a, baz done a LevelDB yo itilize pou estoke done blockchain, men pa gen anyen anpeche w itilize nenpòt lòt, di, MySQL. Koulye a, kite a gade nan estrikti a nan done sa yo.

Ann kòmanse ak tranzaksyon yo: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Men estrikti done li yo:

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
}

TX estoke kalite done a (pou tranzaksyon 2), hash tranzaksyon sa a, kalite tranzaksyon an li menm, yon timestamp, ak antre ak rezilta. Antre TxIn estoke hash tranzaksyon an ki gen referans a, kantite pwodiksyon sa a ak bytecode, ak rezilta TxOut magazen kèk valè ak bytecode tou.

Koulye a, kite a wè ki aksyon yon tranzaksyon ka fè sou done li yo, i.e. Ann gade metòd yo.

Pou kreye yon tranzaksyon, sèvi ak fonksyon tranzaksyon.NewTransaction(txtype byte) *TX.

Metòd AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, erè) ajoute yon opinyon nan tranzaksyon an.

AddTxOut (valè int, done []byte) (*TxOut, erè) metòd ajoute yon pwodiksyon nan tranzaksyon an.

ToBytes() []byte metòd la vire tranzaksyon an nan yon tranch byte.

Fonksyon entèn preByteHash(bytes []byte) fisèl yo itilize nan Build() ak Check() pou fè hash tranzaksyon ki pwodui konpatib ak hash tranzaksyon ki te pwodwi nan aplikasyon JavaScript.

Metòd Build() la mete hash tranzaksyon an jan sa a: tx.TxHash = preByteHash(tx.ToBytes()).

Metòd fisèl ToJSON() konvèti yon tranzaksyon an yon fisèl JSON.

Metòd erè FromJSON(done []byte) chaje yon tranzaksyon ki soti nan fòma JSON ki pase kòm yon tranch byte.

Metòd Check() bool la konpare hachaj ki soti nan jaden tranzaksyon an ak hachaj yo jwenn kòm rezilta hachage tranzaksyon sa a (inyore jaden hash la).

Tranzaksyon yo ajoute nan blòk la: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Estrikti done blòk la pi volumineux:

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
}

DataType estoke kalite done a, ne la sèvi ak li epi fè distenksyon ant blòk la ak yon tranzaksyon oswa lòt done. Pou yon blòk valè sa a se 1.

BlockHeight estoke wotè blòk la.
Timestamp timestamp.
HeaderSize se gwosè blòk an byte.
PrevBlockHash se hash nan blòk anvan an, ak SelfBlockHash se hash la nan yon sèl aktyèl la.
TxsHash se yon hash jeneral nan tranzaksyon yo.
MerkleRoot se rasin pye bwa Merkle a.

Pli lwen nan jaden yo gen kle piblik la nan kreyatè a nan blòk la, siyati a nan kreyatè a, vèsyon an nan blòk la, kantite tranzaksyon nan blòk la, ak tranzaksyon sa yo tèt yo.

Ann gade metòd li yo:
Pou kreye yon blòk, sèvi ak blòk.NewBlock() fonksyon: NewBlock(prevBlockHash string, height int) *Blòk, ki pran hash nan blòk anvan an ak wotè yo mete pou blòk la kreye nan blockchain la. Kalite blòk la tou mete nan konstan pake kalite yo:

b.DataType = types.BLOCK_TYPE.

Metòd AddTx(tx *transaction.TX) ajoute yon tranzaksyon nan yon blòk.

Metòd Build() chaje valè nan jaden blòk la epi jenere ak mete hash aktyèl li yo.

ToBytesHeader() []byte metòd la konvèti tèt blòk la (san tranzaksyon) nan yon tranch byte.

Metòd fisèl ToJSON() konvèti blòk la nan fòma JSON nan yon reprezantasyon fisèl done yo.

Metòd erè FromJSON(done []byte) chaje done ki soti nan JSON nan yon estrikti blòk.

Metòd Check() bool la jenere yon blòk hash epi konpare li ak yon sèl ki espesifye nan jaden an hash blòk.

Metòd fisèl GetTxsHash() la retounen hash total tout tranzaksyon nan blòk la.

Metòd GetMerkleRoot() espesifye rasin pye bwa Merkle a pou tranzaksyon nan yon blòk.

Metòd Sign(privk string) la siyen yon blòk ak kle prive kreyatè blòk la.

Metòd SetHeight(height int) ekri wotè blòk la nan jaden estrikti blòk la.

GetHeight() int metòd la retounen wotè blòk la jan yo espesifye nan jaden korespondan estrikti blòk la.

ToGOBBytes() []byte metòd la kode yon blòk nan fòma GOB epi retounen li kòm yon tranch byte.

Metòd erè FromGOBBytes(done []byte) ekri done blòk nan estrikti blòk la soti nan tranch byte pase a nan fòma GOB.

GetHash() string metòd la retounen hash nan blòk yo bay la.

GetPrevHash() string metòd la retounen hash nan blòk anvan an.

Metòd SetPublicKey(pubk string) ekri kle piblik kreyatè blòk la nan blòk la.

Se konsa, lè l sèvi avèk metòd yo nan objè a Block, nou ka fasilman konvèti li nan yon fòma pou transmisyon sou rezo a ak ekonomize nan baz done LevelDB.

Fonksyon pake blockchain yo responsab pou ekonomize nan blockchain la: github.com/Rusldv/bcstartup/tree/master/blockchain

Pou fè sa, blòk la dwe aplike koòdone IBlock la:

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

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

}

Koneksyon baz done a kreye yon fwa lè pake a inisyalize nan fonksyon init():

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

CloseDB () se yon wrapper pou db.Cloce () - rele apre yo fin travay ak fonksyon yo pake fèmen koneksyon an nan baz done a.

Fonksyon erè SetTargetBlockHash (chaj chay) ekri hash nan blòk aktyèl la ak kle ki espesifye nan konstan BLOCK_HASH nan baz done a.

Fonksyon GetTargetBlockHash() (fisèl, erè) retounen hash nan blòk aktyèl la ki estoke nan baz done a.

Fonksyon erè SetTargetBlockHeight(height int) ekri nan baz done a valè wotè blockchain pou ne ak kle ki espesifye nan konstan BLOCK_HEIGHT la.

Fonksyon GetTargetBlockHeight() (int, erè) retounen wotè blockchain a pou yon ne yo bay, ki estoke nan baz done a.

Fonksyon bool CheckBlock(block IBlock) tcheke yon blòk pou kòrèk anvan li ajoute blòk sa a nan blockchain la.

Fonksyon erè AddBlock(block IBlock) ajoute yon blòk nan blockchain la.

Fonksyon pou rekipere ak gade blòk yo nan fichye explore.go pake blockchain la:

Fonksyon GetBlockByHash(fisèl hash) (*block.Block, erè) kreye yon objè blòk vid, chaje yon blòk nan baz done a, hash la ki te pase l ', epi retounen yon konsèy sou li.

Kreyasyon yon blòk jenèz fèt pa fonksyon erè Genesis() nan dosye genesis.go pake blockchain la.

Pwochen atik la pral pale sou konekte kliyan nan yon ne lè l sèvi avèk mekanis WebSocket la.

Sous: www.habr.com

Add nouvo kòmantè