Fa'afefea ona ou mamanuina poloka ma fefaʻatauaiga i laʻu Go blockchain

Ina ia iu lava ina iʻu i se poloka poloka ae le naʻo se faʻamaumauga, matou te manaʻomia le faʻaopoopoina o elemene taua 3 i la matou poloketi:

  • Faʻamatalaga o faʻamaumauga poloka poloka ma metotia
  • Faʻamatalaga o faʻamaumauga faʻamaumauga ma auala tau fefaʻatauaiga
  • Blockchain galuega e faʻasaoina poloka i totonu o se faʻamaumauga ma maua ai iina e ala i la latou hash poʻo le maualuga (poʻo se isi mea).

Fa'afefea ona ou mamanuina poloka ma fefaʻatauaiga i laʻu Go blockchain

Ole tala lona lua lea e uiga ile poloka poloka mo alamanuia, muamua iinei.

O le manatuaina o fesili na fesiligia ai aʻu e le au faitau e uiga i le tusiga muamua i lenei faasologa, e tatau ona maitauina: i lenei tulaga, o le LevelDB database e faʻaaogaina e teu ai faʻamaumauga poloka poloka, ae leai se mea e taofia ai oe mai le faʻaaogaina o se isi, fai mai, MySQL. Se'i o tatou va'ava'ai i le fa'atulagaina o fa'amaumauga nei.

Tatou amata i fefa'atauaiga: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

O lona fausaga fa'amaumauga lea:

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 teuina le ituaiga faʻamatalaga (mo fefaʻatauaiga 2), o le hash o lena fefaʻatauaiga, le ituaiga o fefaʻatauaiga lava ia, se faailoga taimi, ma mea e fai ma mea e fai. TxIn mea fa'aoga e teu ai le hash o le fefa'ataua'iga o lo'o fa'asino i ai, le numera o lenei galuega ma le bytecode, ma TxOut galuega fa'aopoopo e teu ai sina tau ma le bytecode.

Se'i o tatou va'ai po'o a gaioiga e mafai e se fefa'ataua'iga ona faia i luga o ana fa'amaumauga, i.e. Sei o tatou vaavaai i metotia.

Ina ia faia se fefaʻatauaiga, faʻaaoga le fefaʻatauaiga.NewTransaction(txtype byte) *TX galuega.

O le AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) e faʻaopoopoina ai se faʻaoga i le fefaʻatauaiga.

O le AddTxOut(value int, data []byte) (*TxOut, error) e fa'aopoopoina ai se gaioiga i le fefa'atauaiga.

O le ToBytes() []byte method e fa'aliliuina ai le fefa'ataua'iga i se fasi byte.

O le galuega i totonu preByteHash(bytes []byte) manoa o loʻo faʻaaogaina i le Fausia () ma le Siaki () e faʻaogaina ai le faʻasalalauga faʻatauga faʻatasi ma faʻamatalaga faʻatau na gaosia mai talosaga JavaScript.

O le Build() method e fa'atulaga ai le fa'atauga o fefa'atauaiga e fa'apea: tx.TxHash = preByteHash(tx.ToBytes()).

O le ToJSON() string method e liua ai se fefa'ataua'iga i se manoa JSON.

O le FromJSON(data []byte) auala sese e utaina ai se fefaʻatauaiga mai le JSON faʻasologa na pasia o se fasi byte.

O le Check() bool method e fa'atusatusaina ai le hash e maua mai le fanua hash transaction ma le hash na maua ona o le fa'afefeina o lenei fefa'ataua'iga (le amana'ia le fanua hash).

O fefa'atauaiga ua fa'aopoopo i le poloka: github.com/Rusldv/bcstartup/blob/master/block/builder.go

O le fausaga o faʻamaumauga poloka e sili atu le voluminous:

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 teuina le ituaiga faʻamatalaga, faʻaaogaina e le node ma faʻaeseese le poloka mai se fefaʻatauaiga poʻo isi faʻamatalaga. Mo se poloka o lenei tau e 1.

BlockHeight e teuina le maualuga o le poloka.
Faailoga taimi.
HeaderSize o le tele poloka i paita.
PrevBlockHash o le hash o le poloka muamua, ma SelfBlockHash o le hash o le taimi nei.
TxsHash o se faʻasalalauga lautele o fefaʻatauaiga.
MerkleRoot o le a'a o le laau Merkle.

E le gata i lea i totonu o fanua o loʻo i ai le ki lautele a le na faia le poloka, le saini a le na faia, le faʻasologa o le poloka, le numera o fefaʻatauaiga i totonu o le poloka, ma nei fefaʻatauaiga lava ia.

Se'io tatou va'ai i ona metotia:
Ina ia faia se poloka, faʻaaoga le poloka.NewBlock() galuega: NewBlock(prevBlockHash manoa, maualuga int) *Polo, lea e ave ai le hash o le poloka muamua ma le maualuga seti mo le poloka na faia i le poloka poloka. O le ituaiga poloka e seti foi mai le ituaiga afifi tumau:

b.DataType = types.BLOCK_TYPE.

O le AddTx(tx *transaction.TX) auala e faʻaopoopoina ai se fefaʻatauaiga i se poloka.

O le Build() auala e utaina ai tau i totonu o fanua o le poloka ma faʻatupuina ma seti lona hash o loʻo iai nei.

O le ToBytesHeader() []byte method e liua ai le ulutala poloka (e aunoa ma ni fefa'ataua'iga) i totonu o se fasi byte.

O le ToJSON() string method e liua ai le poloka i le JSON format i se manoa faʻatusa o faʻamatalaga.

O le FromJSON(data []byte) auala sese e utaina faʻamaumauga mai le JSON i se fausaga poloka.

O le Check() bool method e fa'atupuina ai se poloka poloka ma fa'atusatusa i le tasi o lo'o fa'amaoti mai ile poloka poloka poloka.

O le GetTxsHash() string method e toe fa'afo'i ai le aofa'i o fa'atauga uma i totonu o le poloka.

O le GetMerkleRoot() auala e faʻamaonia ai le aʻa o le laau Merkle mo fefaʻatauaiga i totonu o se poloka.

O le auala Fa'ailoga(privk string) e saini ai se poloka i le ki patino a le tagata na faia poloka.

O le SetHeight(maualuga int) metotia e tusia ai le maualuga o le poloka i le poloka fausaga fanua.

O le GetHeight() int method e toe fa'afo'i mai ai le maualuga o le poloka e pei ona fa'ailoa mai i totonu o le fanua fa'atatau o le fausaga poloka.

O le ToGOBBytes() []byte method e fa'ailoga poloka i le GOB fa'atulagaina ma toe fa'afo'i mai e pei o se fasi byte.

Ole auala sese ole FromGOBBytes(data []byte) e tusia ai fa'amaumauga poloka ile fausaga poloka mai le fasi byte ua pasia ile faatulagaga GOB.

O le GetHash() string method e toe fa'afo'i ai le hash o le poloka ua tu'uina atu.

O le GetPrevHash() string method e toe faafoi mai ai le hash o le poloka muamua.

Ole SetPublicKey(pubk string) e tusi ai le ki fa'alaua'itele a le tagata na faia poloka ile poloka.

O le mea lea, i le faʻaaogaina o metotia o le mea Block, e mafai ona faigofie ona tatou faʻaliliuina i se faatulagaga mo le faʻasalalau i luga o le upega tafaʻilagi ma sefe i le LevelDB database.

O galuega a le poloka poloka poloka e nafa ma le teuina i le poloka poloka: github.com/Rusldv/bcstartup/tree/master/blockchain

Ina ia faia lenei mea, e tatau i le poloka ona faʻaogaina le IBlock interface:

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

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

}

Ole feso'ota'iga fa'amaumauga e faia i le taimi e amata ai le afifi ile init() galuega:

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

CloseDB () o se afifi mo db.Cloce () - valaau pe a uma ona galue ma le afifi galuega tauave e tapunia le sootaga i le database.

O le SetTargetBlockHash (hash string) galuega sese e tusia ai le hash o le poloka o loʻo iai nei ma le ki faʻamaonia e le BLOCK_HASH tumau i le database.

O le galuega GetTargetBlockHash() ( manoa, sese) e toe faafoi ai le hash o le poloka o loʻo iai nei o loʻo teuina i totonu o faʻamaumauga.

O le SetTargetBlockHeight(maualuga int) sese galuega e tusi i le database le tau o le maualuga poloka poloka mo le node ma le ki faʻamaonia e le BLOCK_HEIGHT tumau.

O le GetTargetBlockHeight() (int, error) galuega e toe faafoi mai ai le maualuga o le poloka poloka mo se node ua tuʻuina atu, teuina i totonu o faʻamaumauga.

Ole CheckBlock(block IBlock) bool function e siaki ai se poloka mo le sa'o a'o le'i fa'aopoopoina le poloka lea ile poloka poloka.

Ole galuega sese ole AddBlock(block IBlock) e fa'aopoopoina se poloka ile poloka poloka.

O galuega mo le toe aumai ma le matamataina o poloka o loʻo i le faila explore.go o le poloka poloka poloka:

O le GetBlockByHash(hash string) (*block.Block, error) galuega e faia ai se mea poloka poloka gaogao, utaina se poloka mai le database o lona hash na pasi atu i ai ma toe faafoi atu se faasinoala i ai.

O le fausiaina o se poloka genesis o loʻo faʻatinoina e le Kenese () galuega sese mai le genesis.go faila o le poloka poloka poloka.

O le isi tusiga o le a talanoa e uiga i le faʻafesoʻotaʻi o tagata faʻatau i se node e faʻaaoga ai le WebSocket mechanism.

puna: www.habr.com

Faaopoopo i ai se faamatalaga