Ny fomba nandrafetako sakana sy fifampiraharahana tao amin'ny Go blockchain-ko

Mba hiafara amin'ny blockchain fa tsy angon-drakitra fotsiny dia mila manampy singa manan-danja 3 amin'ny tetikasantsika isika:

  • Famaritana ny rafitra sy ny fomba angona sakana
  • Famaritana ny firafitry ny angona sy ny fomba fiasa
  • Ny fiasa Blockchain izay mitahiry sakana ao anaty angon-drakitra ary mahita azy ireo ao amin'ny hash na haavony (na zavatra hafa).

Ny fomba nandrafetako sakana sy fifampiraharahana tao amin'ny Go blockchain-ko

Ity no lahatsoratra faharoa momba ny blockchain ho an'ny indostria, ny voalohany eto.

Raha mahatsiaro ny fanontaniana napetraky ny mpamaky ahy momba ny lahatsoratra teo aloha amin'ity andiany ity, dia tokony ho marihina: amin'ity tranga ity, ny angon-drakitra LevelDB dia ampiasaina amin'ny fitahirizana angon-drakitra blockchain, saingy tsy misy manakana anao tsy hampiasa hafa, hoy ny MySQL. Andeha hojerentsika izao ny firafitry ny data.

Andao hanomboka amin'ny fifampiraharahana: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Ity ny firafitry ny angona:

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
}

Ny TX dia mitahiry ny karazana data (ho an'ny transaction 2), ny hash amin'io fifampiraharahana io, ny karazana fifampiraharahana mihitsy, ny famantaranandro ary ny fampidirana sy ny vokatra. Ny fampidirana TxIn dia mitahiry ny hash amin'ny fifampiraharahana izay misy references ny vokatra, ny isan'io vokatra io sy ny bytecode, ary ny vokatra TxOut dia mitahiry sanda sasany ary koa bytecode.

Andeha hojerentsika izao ny hetsika azon'ny fifampiraharahana atao amin'ny angonany, i.e. Andeha hojerentsika ny fomba.

Mba hamoronana fifampiraharahana dia ampiasao ny transaction.NewTransaction(txtype byte) *TX function.

Ny AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) dia manampy fampidirana amin'ny fifampiraharahana.

Ny AddTxOut(value int, data []byte) (*TxOut, error) dia manampy vokatra amin'ny fifampiraharahana.

Ny fomba ToBytes() []byte dia mamadika ny fifanakalozana ho tapa-byte.

Ny tady anatiny preByteHash(bytes []byte) dia ampiasaina ao amin'ny Build() sy Check() mba hampifanaraka ny hash transaction natsangana amin'ny hash transaction navoakan'ny rindranasa JavaScript.

Ny fomba Build() dia mametraka ny hash transaction toy izao manaraka izao: tx.TxHash = preByteHash(tx.ToBytes()).

Ny fomba tady ToJSON() dia mamadika ny fifampiraharahana ho tady JSON.

Ny fomba fahadisoan'ny FromJSON(data []byte) dia mametaka fifampiraharahana avy amin'ny endrika JSON nandalo ho tapa-byte.

Ny fomba Check() bool dia mampitaha ny hash azo avy amin'ny sehatry ny hash transaction amin'ny hash azo vokatry ny hashing ity transaction ity (tsy miraharaha ny saha hash).

Ampidirina amin'ny sakana ny fifampiraharahana: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Ny firafitry ny angona sakana dia betsaka kokoa:

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 dia mitahiry ny karazana data, ny node dia mampiasa azy ary manavaka ny sakana amin'ny fifanakalozana na angona hafa. Ho an'ny sakana iray dia 1 io sanda io.

BlockHeight dia mitahiry ny haavon'ny sakana.
Fotoam-potoana.
HeaderSize dia ny haben'ny sakana amin'ny bytes.
PrevBlockHash no hash an'ny block teo aloha, ary SelfBlockHash no hash an'ny ankehitriny.
TxsHash dia tenifototra ankapobeny amin'ny fifanakalozana.
MerkleRoot no fototry ny hazo Merkle.

Ao amin'ny saha dia misy ny fanalahidin'ny daholobe ny mpamorona ny sakana, ny sonian'ny mpamorona, ny dikan'ny sakana, ny isan'ny varotra ao amin'ny sakana, ary ireo varotra ireo ihany koa.

Andeha hojerentsika ny fomba fiasany:
Mba hamoronana sakana dia ampiasao ny fiasa block.NewBlock(): NewBlock(prevBlockHash string, height int) *Block, izay maka ny hash amin'ny sakana teo aloha sy ny haavony napetraka ho an'ny sakana noforonina ao amin'ny sakana. Ny karazana sakana dia napetraka avy amin'ny karazana fonosana tsy miova:

b.DataType = types.BLOCK_TYPE.

Ny fomba AddTx(tx *transaction.TX) dia manampy fifampiraharahana amin'ny sakana iray.

Ny fomba Build() dia mampiditra sanda ao amin'ny sahan'ny sakana ary mamorona sy mametraka ny hash misy azy ankehitriny.

Ny fomba ToBytesHeader() []byte dia mamadika ny lohatenin'ny sakana (tsy misy fifampiraharahana) ho tapa-byte.

Ny fomba tady ToJSON() dia mamadika ny sakana ho endrika JSON amin'ny fanehoana tady ny angona.

Ny fomba fahadisoan'ny FromJSON(data []byte) dia mampiditra angona avy amin'ny JSON ho rafitra sakana.

Ny fomba Check() bool dia mamokatra bloc hash ary mampitaha azy amin'ilay voalaza ao amin'ny sahan'ny hash block.

Ny fomba tady GetTxsHash() dia mamerina ny totalin'ny tenifototra amin'ny fifanakalozana rehetra ao amin'ny sakana.

Ny fomba GetMerkleRoot() dia mamaritra ny fototry ny hazo Merkle ho an'ny fifanakalozana amin'ny sakana iray.

Ny fomba famantarana (privk string) dia manasonia sakana iray miaraka amin'ny fanalahidy manokana an'ny mpamorona sakana.

Ny fomba SetHeight(height int) dia manoratra ny haavon'ny sakana amin'ny saha firafitry ny sakana.

Ny fomba GetHeight() int dia mamerina ny haavon'ny sakana araka ny voalaza ao amin'ny saha mifanaraka amin'ny rafitra sakana.

Ny fomba ToGOBBytes() []byte dia manodinkodina sakana amin'ny endrika GOB ary mamerina azy ho tapa-byte.

Ny fomba fahadisoan'ny FromGOBBytes(data []byte) dia manoratra angona sakana amin'ny firafitry ny sakana avy amin'ny tapa-byte nandalo amin'ny endrika GOB.

Ny fomba tady GetHash() dia mamerina ny hash amin'ny sakana nomena.

Ny fomba tady GetPrevHash() dia mamerina ny hash amin'ny sakana teo aloha.

Ny fomba SetPublicKey(pubk string) dia manoratra ny fanalahidin'ny mpamorona sakana amin'ny sakana.

Noho izany, amin'ny fampiasana ny fomba fiasan'ny Block object, dia afaka manova azy mora foana ho endrika fampitana amin'ny tambajotra ary mitahiry amin'ny angona LevelDB.

Ny fiasan'ny fonosana blockchain dia tompon'andraikitra amin'ny fitahirizana ny blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Mba hanaovana izany, ny sakana dia tsy maintsy mampihatra ny interface IBlock:

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

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

}

Ny fifandraisana amin'ny database dia noforonina indray mandeha rehefa natomboka tao amin'ny asa init() ny fonosana:

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

CloseDB() dia wrapper ho an'ny db.Cloce() - antsoina rehefa avy niasa tamin'ny fonosana miasa mba hanakatona ny fifandraisana amin'ny tahiry.

Ny fiasan'ny SetTargetBlockHash(hash string) dia manoratra ny hash amin'ny sakana amin'izao fotoana izao miaraka amin'ny fanalahidy voatondron'ny BLOCK_HASH constant amin'ny angon-drakitra.

Ny asa GetTargetBlockHash() (tady, hadisoana) dia mamerina ny hash amin'ny sakana misy ankehitriny voatahiry ao amin'ny tahiry.

Ny fiasan'ny hadisoana SetTargetBlockHeight(haavo int) dia manoratra amin'ny tahiry ny sandan'ny haavon'ny blockchain ho an'ny node miaraka amin'ny fanalahidy voatondro amin'ny BLOCK_HEIGHT constant.

Ny asa GetTargetBlockHeight() (int, error) dia mamerina ny haavon'ny sakana ho an'ny node iray, voatahiry ao anaty tahiry.

Ny fiasan'ny CheckBlock(block IBlock) bool dia manamarina sakana iray ho an'ny marina alohan'ny hampidirana ity sakana ity amin'ny sakana.

Ny fiasan'ny hadisoana AddBlock(block IBlock) dia manampy sakana amin'ny sakana.

Ao amin'ny rakitra explore.go amin'ny fonosana blockchain ny fiasa amin'ny fakana sy fijerena sakana:

Ny asa GetBlockByHash(hash string) (*block.Block, error) dia mamorona zavatra sakana tsy misy na inona na inona, mampiditra sakana iray ao aminy avy amin'ny angon-drakitra, izay nampitaina azy ny hash, ary mamerina tondro ho azy.

Ny famoronana sakana genesisy dia tanterahan'ny asan'ny hadisoana Genesis() avy amin'ny rakitra genesis.go amin'ny fonosana blockchain.

Ny lahatsoratra manaraka dia hiresaka momba ny fampifandraisana ny mpanjifa amin'ny node amin'ny alΓ lan'ny mekanika WebSocket.

Source: www.habr.com

Add a comment