Giunsa nako pagdesinyo ang mga bloke ug mga transaksyon sa akong Go blockchain

Aron sa katapusan mahuman sa usa ka blockchain ug dili lamang usa ka database, kinahanglan namon nga idugang ang 3 nga hinungdanon nga mga elemento sa among proyekto:

  • Deskripsyon sa istruktura ug mga pamaagi sa datos sa block
  • Deskripsyon sa istruktura sa datos ug mga pamaagi sa transaksyon
  • Ang mga gimbuhaton sa Blockchain nga nagtipig sa mga bloke sa usa ka database ug makit-an kini didto pinaagi sa ilang hash o gitas-on (o uban pa).

Giunsa nako pagdesinyo ang mga bloke ug mga transaksyon sa akong Go blockchain

Kini ang ikaduha nga artikulo bahin sa blockchain alang sa industriya, ang una dinhi.

Ang paghinumdom sa mga pangutana nga gipangutana sa mga magbabasa kanako mahitungod sa miaging artikulo niini nga serye, kini kinahanglan nga matikdan: sa niini nga kaso, ang LevelDB database gigamit sa pagtipig blockchain data, apan walay makapugong kanimo sa paggamit sa bisan unsa nga lain, ingon, MySQL. Karon atong tan-awon ang istruktura niini nga datos.

Magsugod ta sa mga transaksyon: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Ania ang istruktura sa datos niini:

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
}

Gitipigan sa TX ang tipo sa datos (alang sa transaksyon 2), ang hash sa kana nga transaksyon, ang tipo sa transaksyon mismo, usa ka timestamp, ug mga input ug output. Ang mga input sa TxIn nagtipig sa hash sa transaksyon kansang output gi-refer, ang gidaghanon niini nga output ug bytecode, ug ang TxOut nga mga output nagtipig pipila ka bili ug usab bytecode.

Karon tan-awon nato kung unsa nga mga aksyon ang mahimo sa usa ka transaksyon sa datos niini, i.e. Atong tan-awon ang mga pamaagi.

Para makahimo ug transaksyon, gamita ang transaction.NewTransaction(txtype byte) *TX function.

Ang AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) nga pamaagi nagdugang og input sa transaksyon.

Ang AddTxOut(value int, data []byte) (*TxOut, error) nga pamaagi nagdugang ug output sa transaksyon.

Ang ToBytes() []byte nga pamaagi naghimo sa transaksyon ngadto sa byte slice.

Ang internal function nga preByteHash(bytes []byte) string gigamit sa Build() ug Check() aron ang namugna nga transaction hash compatible sa transaction hash nga namugna gikan sa JavaScript applications.

Ang Build() nga pamaagi nagtakda sa transaction hash sama sa mosunod: tx.TxHash = preByteHash(tx.ToBytes()).

Ang ToJSON() string method nag-convert sa transaksyon ngadto sa JSON string.

Ang FromJSON(data []byte) error method nagkarga ug transaksyon gikan sa JSON format nga gipasa isip byte slice.

Ang Check() bool method nagtandi sa resulta nga hash gikan sa transaction hash field uban sa hash nga nakuha isip resulta sa pag-hash niini nga transaksyon (wala magtagad sa hash field).

Ang mga transaksyon gidugang sa block: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Ang istruktura sa data sa bloke labi ka daghan:

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
}

Gitipigan sa DataType ang tipo sa datos, gigamit kini sa node ug gipalahi ang block gikan sa usa ka transaksyon o uban pang datos. Alang sa usa ka bloke kini nga kantidad mao ang 1.

Ang BlockHeight nagtipig sa gitas-on sa block.
timestamp nga timestamp.
Ang HeaderSize mao ang block size sa bytes.
Ang PrevBlockHash mao ang hash sa miaging block, ug ang SelfBlockHash mao ang hash sa kasamtangan.
Ang TxsHash usa ka kinatibuk-ang hash sa mga transaksyon.
Ang MerkleRoot mao ang gamot sa kahoy nga Merkle.

Dugang pa sa mga natad adunay publiko nga yawe sa tiglalang sa block, ang pirma sa tiglalang, ang bersyon sa block, ang gidaghanon sa mga transaksyon sa block, ug kini nga mga transaksyon mismo.

Atong tan-awon ang mga pamaagi niini:
Para makahimo ug block, gamita ang block.NewBlock() function: NewBlock(prevBlockHash string, height int) *Block, nga magkuha sa hash sa miaging block ug ang height set para sa gibuhat block sa blockchain. Ang tipo sa block gitakda usab gikan sa mga tipo sa pakete nga kanunay:

b.DataType = types.BLOCK_TYPE.

Ang AddTx(tx *transaction.TX) nga pamaagi makadugang ug transaksyon sa usa ka block.

Ang Build() nga pamaagi nagkarga sa mga kantidad sa mga field sa block ug nagmugna ug nagtakda sa kasamtangang hash niini.

Ang ToBytesHeader() []byte method nag-convert sa block header (walay mga transaksyon) ngadto sa byte slice.

Ang ToJSON() string method nag-convert sa block ngadto sa JSON format sa string representation sa data.

Ang FromJSON(data []byte) nga pamaagi sa sayop nagkarga sa datos gikan sa JSON ngadto sa block structure.

Ang Check() bool nga pamaagi makamugna ug block hash ug itandi kini sa usa nga gipiho sa block hash field.

Ang GetTxsHash() string method mibalik sa total hash sa tanang transaksyon sa block.

Ang GetMerkleRoot() nga pamaagi nagtino sa gamut sa Merkle tree para sa mga transaksyon sa usa ka block.

Ang Sign(privk string) nga pamaagi nagpirma sa usa ka block gamit ang private key sa block creator.

Ang SetHeight(height int) nga pamaagi nagsulat sa gitas-on sa block ngadto sa block structure field.

Ang GetHeight() int nga pamaagi nagbalik sa gitas-on sa block sama sa gipiho sa katugbang nga field sa block structure.

Ang ToGOBBytes() []byte nga pamaagi nag-encode sa block sa GOB format ug gibalik kini isip byte slice.

Ang FromGOBBytes(data []byte) nga pamaagi sa sayop nagsulat sa block data ngadto sa block structure gikan sa gipasa nga byte slice sa GOB format.

Ang GetHash() string method nagbalik sa hash sa gihatag nga block.

Ang GetPrevHash() string method nagbalik sa hash sa miaging block.

Ang SetPublicKey(pubk string) nga pamaagi nagsulat sa public key sa block creator ngadto sa block.

Busa, gamit ang mga pamaagi sa Block object, dali namong ma-convert kini ngadto sa format para sa transmission sa network ug maka-save sa LevelDB database.

Ang mga gimbuhaton sa blockchain package mao ang responsable sa pagtipig sa blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Aron mahimo kini, ang block kinahanglan nga ipatuman ang interface sa IBlock:

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

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

}

Ang koneksyon sa database gihimo sa makausa kung ang package gisugdan sa init () function:

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

CloseDB() mao ang usa ka wrapper alang sa db.Cloce() - gitawag human sa pagtrabaho uban sa mga function sa package sa pagsira sa koneksyon sa database.

Ang SetTargetBlockHash(hash string) error function nagsulat sa hash sa kasamtangan nga block nga adunay yawe nga gipiho sa BLOCK_HASH constant sa database.

Ang GetTargetBlockHash() (string, error) function nagbalik sa hash sa kasamtangang block nga gitipigan sa database.

Ang SetTargetBlockHeight(height int) error function nagsulat sa database sa bili sa blockchain height para sa node nga adunay yawe nga gipiho sa BLOCK_HEIGHT constant.

Ang GetTargetBlockHeight() (int, error) function nagbalik sa gitas-on sa blockchain alang sa gihatag nga node, nga gitipigan sa database.

Ang CheckBlock(block IBlock) bool function nagsusi sa usa ka block alang sa pagkasakto sa dili pa idugang kini nga block sa blockchain.

Ang AddBlock(block IBlock) error function nagdugang ug block sa blockchain.

Ang mga gimbuhaton alang sa pagkuha ug pagtan-aw sa mga bloke anaa sa explore.go file sa blockchain package:

Ang GetBlockByHash(hash string) (*block.Block, error) nga function nagmugna ug walay sulod nga block object, nagkarga ug block niini gikan sa database, ang hash nga gipasa niini, ug nagbalik ug pointer niini.

Ang paghimo sa usa ka genesis block gihimo sa Genesis() error function gikan sa genesis.go file sa blockchain package.

Ang sunod nga artikulo maghisgot bahin sa pagkonektar sa mga kliyente sa usa ka node gamit ang mekanismo sa WebSocket.

Source: www.habr.com

Idugang sa usa ka comment