Otu m siri chepụta blocks na azụmahịa na Go blockchain m

Iji mechaa nweta blockchain ọ bụghị naanị nchekwa data, anyị kwesịrị ịgbakwunye ihe atọ dị mkpa na ọrụ anyị:

  • Nkọwa nke usoro data ngọngọ na ụzọ
  • Nkọwa nke nhazi data na ụzọ azụmahịa
  • Blockchain na-arụ ọrụ na-echekwa ngọngọ na nchekwa data wee chọta ha ebe ahụ site na hash ma ọ bụ ịdị elu ha (ma ọ bụ ihe ọzọ).

Otu m siri chepụta blocks na azụmahịa na Go blockchain m

Nke a bụ isiokwu nke abụọ gbasara blockchain maka ụlọ ọrụ, nke mbụ ebe a.

Icheta ajụjụ ndị na-agụ akwụkwọ jụrụ m banyere isiokwu gara aga na usoro isiokwu a, ekwesịrị ịdebe: na nke a, a na-eji nchekwa data LevelDB na-echekwa data blockchain, ma ọ dịghị ihe na-egbochi gị iji ihe ọ bụla ọzọ, sị, MySQL. Ugbu a, ka anyị leba anya na nhazi nke data a.

Ka anyị malite na azụmahịa: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Nke a bụ nhazi data ya:

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 na-echekwa ụdị data (maka azụmahịa 2), hash nke azụmahịa ahụ, ụdị azụmahịa ahụ n'onwe ya, akara oge, yana ntinye na ntinye. Ntinye TxIn na-echekwa hash nke azụmahịa nke etinyere aka na mmepụta ya, ọnụọgụ nke mmepụta a na bytecode, na ntinye TxOut na-echekwa ụfọdụ uru yana kwa bytecode.

Ugbu a, ka anyị hụ ihe omume azụmahịa nwere ike ime na data ya, ya bụ. Ka anyị leba anya na ụzọ ndị ahụ.

Iji mepụta azụmahịa, jiri azụmahịa ahụ.NewTransaction(txtype byte) *ọrụ TX.

Usoro AddTxIn (thattxhash [] byte, txoutn int, koodu [] byte) (*TxIn, njehie) na-agbakwunye ntinye na azụmahịa ahụ.

Usoro AddTxOut (uru int, data [] byte) (*TxOut, njehie) na-agbakwụnye mmepụta na azụmahịa ahụ.

Usoro ToBytes() []byte na-atụgharị azụmahịa ahụ ka ọ bụrụ iberi byte.

A na-eji eriri ime preByteHash(bytes []byte) arụ ọrụ na Mee () na Lelee() iji mee hash azụmahịa emepụtara dakọtara na hashes azụmahịa ewepụtara na ngwa Javascript.

Usoro Build() na-edobe hash azụmahịa dịka ndị a: tx.TxHash = preByteHash(tx.ToBytes()).

Usoro eriri ToJSON() na-atụgharị azụmahịa ka ọ bụrụ eriri JSON.

Usoro njehie FromJSON(data []byte) na-ebu azụmahịa site na usoro JSON gafere dị ka iberi byte.

Usoro Check() bool na-atụnyere hash na-esi na mpaghara hash azụmahịa na hash enwetara n'ihi hashing azụmahịa a (na-eleghara ubi hash anya).

A na-agbakwunye azụmahịa na ngọngọ: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Nhazi data ngọngọ na-abawanye ụba:

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 na-echekwa ụdị data, ọnụ na-eji ya ma na-amata ọdịiche dị na ngọngọ site na azụmahịa ma ọ bụ data ndị ọzọ. Maka ngọngọ, uru a bụ 1.

BlockHeight na-echekwa ịdị elu nke ngọngọ ahụ.
Oge stampụ.
HeaderSize bụ nha ngọngọ na bytes.
PrevBlockHash bụ hash nke ngọngọ gara aga, yana SelfBlockHash bụ hash nke dị ugbu a.
TxsHash bụ hash azụmahịa zuru oke.
MerkleRoot bụ mgbọrọgwụ nke osisi Merkle.

Ọzọkwa na ubi enwere igodo ọha nke onye okike nke ngọngọ, mbinye aka nke onye okike, nsụgharị nke ngọngọ, ọnụ ọgụgụ nke azụmahịa na ngọngọ, na azụmahịa ndị a n'onwe ha.

Ka anyị lee usoro ya anya:
Iji mepụta ngọngọ, jiri ihe mgbochi.NewBlock() ọrụ: NewBlock(prevBlockHash string, height int) *Block, nke na-ewe hash nke ngọngọ gara aga na ịdị elu setịpụrụ maka ngọngọ emepụtara na blockchain. A na-edozikwa ụdị ngọngọ site na ụdị ngwugwu mgbe niile:

b.DataType = types.BLOCK_TYPE.

Usoro AddTx(tx *transaction.TX) na-agbakwụnye azụmahịa na ngọngọ.

Usoro Build() na-ebu ọnụ ahịa n'ime ogige ngọngọ wee mepụta ma tọọ hash ugbu a.

Usoro ToBytesHeader () [] byte na-atụgharị nkụnye eji isi mee (na-enweghị azụmahịa) ka ọ bụrụ iberi byte.

Usoro eriri ToJSON() na-atụgharị ngọngọ ka ọ bụrụ usoro JSON na nnochite anya eriri data.

Ụzọ njehie FromJSON(data []byte) na-ebu data sitere na JSON n'ime ihe mgbochi.

Usoro Check() bool na-ewepụta hash ngọngọ wee jiri ya tụnyere nke akọwapụtara na ogige hash ngọngọ.

Usoro eriri GetTxsHash() na-eweghachi mkpokọta hash nke azụmahịa niile na ngọngọ.

Usoro GetMerkleRoot() na-akọwapụta mgbọrọgwụ osisi Merkle maka azụmahịa na ngọngọ.

Ụzọ Sign(privk string) na-eji igodo nzuzo nke onye kere ihe na-egosi ngọngọ.

Usoro SetHeight(ịdị elu int) na-ede ịdị elu nke ngọngọ na ogige nhazi ihe mgbochi.

Usoro GetHeight () int na-eweghachite ịdị elu nke ngọngọ dị ka akọwapụtara na mpaghara kwekọrọ na nhazi ngọngọ.

Usoro ToGOBBytes() []byte na-edobe ngọngọ n'ụdị GOB wee weghachi ya dị ka iberi byte.

Usoro njehie FromGOBBytes(data []byte) na-ede data ngọngọ na nhazi ngọngọ site na iberi byte gafere na usoro GOB.

Usoro eriri GetHash() na-eweghachi hash nke ngọngọ enyere.

Ụzọ eriri GetPrevHash() na-eweghachite hash nke ngọngọ gara aga.

Usoro SetPublicKey(pubk string) na-ede igodo ọha nke onye nrụpụta ngọngọ na ngọngọ.

Ya mere, iji ụzọ nke Block ihe, anyị nwere ike mfe tọghata ya n'ime a usoro maka nnyefe na netwọk na-azọpụta na LevelDB nchekwa data.

Ọrụ nke ngwugwu blockchain bụ maka ịchekwa na blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Iji mee nke a, ngọngọ ga-emejuputa interface IBlock:

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

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

}

A na-emepụta njikọ nchekwa data otu ugboro mgbe etinyere ngwugwu na ọrụ init():

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

CloseDB () bụ ihe mkpuchi maka db.Cloce () - a na-akpọ mgbe ọ rụchara ọrụ ngwugwu iji mechie njikọ na nchekwa data.

Ọrụ njehie SetTargetBlockHash(hash string) na-ede hash nke ngọngọ dị ugbu a na igodo nke BLOCK_HASH na-agbanwe agbanwe na nchekwa data.

Ọrụ GetTargetBlockHash() (eriri, njehie) na-eweghachite hash nke ngọngọ dị ugbu a echekwara na nchekwa data.

Ọrụ njehie SetTargetBlockHeight(height int) na-ede na nchekwa data uru nke ịdị elu blockchain maka ọnụ ọnụ na igodo akọwapụtara site na BLOCK_HEIGHT mgbe niile.

Ọrụ GetTargetBlockHeight() (int, njehie) na-eweghachite ịdị elu nke blockchain maka ọnụ ọnụ enyere, echekwara na nchekwa data.

Ọrụ CheckBlock(block IBlock) bool na-enyocha ngọngọ maka izi ezi tupu ịgbakwunye ngọngọ a na blockchain.

Ọrụ njehie AddBlock (block IBlock) na-agbakwunye ngọngọ na blockchain.

Ọrụ maka iweghachite na ikiri ngọngọ dị na faịlụ explore.go nke ngwugwu blockchain:

Ọrụ GetBlockByHash (eriri hash) (*block.Block, error) na-emepụta ihe mgbochi efu, na-ebunye ngọngọ n'ime ya site na nchekwa data, nke hash nke e bufere ya na ya, ma weghachi ya pointer.

Ihe okike nke ngọngọ genesis na-arụ ọrụ njehie Jenesis () site na faịlụ genesis.go nke ngwugwu blockchain.

Isiokwu na-esote ga-ekwu maka ijikọ ndị ahịa na ọnụ ọnụ site na iji usoro WebSocket.

isi: www.habr.com

Tinye a comment