Momwe Ndidapangira Ma Blocks ndi Transactions pa My Go Blockchain

Kuti pamapeto pake tithe kukhala ndi blockchain osati nkhokwe chabe, tiyenera kuwonjezera zinthu zitatu zofunika ku polojekiti yathu:

  • Kufotokozera za dongosolo la block data ndi njira
  • Kufotokozera za dongosolo la deta ndi njira zogulitsira
  • Ntchito za blockchain zomwe zimasunga midadada mu nkhokwe ndikuzipeza pamenepo ndi hashi kapena kutalika kwake (kapena china chake).

Momwe Ndidapangira Ma Blocks ndi Transactions pa My Go Blockchain

Iyi ndi nkhani yachiwiri yokhudza blockchain yamakampani, yoyamba apa.

Kukumbukira mafunso omwe owerenga adandifunsa pa nkhani yapitayi mndandandawu, ziyenera kudziwidwa: pakadali pano, database ya LevelDB imagwiritsidwa ntchito kusunga deta ya blockchain, koma palibe chomwe chimakulepheretsani kugwiritsa ntchito china chilichonse, kunena, MySQL. Tsopano tiyeni tione kamangidwe ka deta iyi.

Tiyeni tiyambe ndi malonda: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Nayi kapangidwe kake ka data:

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 imasunga mtundu wa data (pochita 2), hashi yamalondawo, mtundu wamalondawo, chidindo chanthawi, zolowetsa ndi zotuluka. Zolowetsa za TxIn zimasunga hashi ya ndalama zomwe zotulutsa zake zimatchulidwa, kuchuluka kwa zomwe zimachokera ndi bytecode, ndipo zotuluka za TxOut zimasunga mtengo wake komanso ma bytecode.

Tsopano tiyeni tiwone zomwe malonda angachite pa data yake, i.e. Tiyeni tione njira.

Kuti mupange malonda, gwiritsani ntchito transaction.NewTransaction(txtype byte) *TX ntchito.

Njira ya AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) imawonjezera cholowa pamalondawo.

Njira ya AddTxOut(value int, data []byte) (*TxOut, error) imawonjezera zotulukapo pakuchitapo.

Njira ya ToBytes() []byte imasintha malondawo kukhala kagawo kakang'ono.

Chingwe chamkati cha preByteHash(bytes []byte) chimagwiritsidwa ntchito mu Build() ndi Check() kuti ma hashi opangidwa kuti azigwirizana ndi ma hashi opangidwa kuchokera ku mapulogalamu a JavaScript.

Njira ya Build () imakhazikitsa hashi yogulitsa motere: tx.TxHash = preByteHash(tx.ToBytes()).

Njira ya chingwe cha ToJSON() imasintha malonda kukhala chingwe cha JSON.

Njira yolakwika ya FromJSON(data []byte) imakweza malonda kuchokera mumtundu wa JSON wodutsa ngati kagawo kakang'ono.

Njira ya Check() bool imafanizira ma hashi omwe amachokera kumunda wa hashi ndi hashi yomwe idapezedwa chifukwa chahashi iyi (kunyalanyaza gawo la hashi).

Zogulitsa zikuwonjezedwa ku block: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Dongosolo la data la block ndilokulirapo:

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 imasunga mtundu wa deta, node imagwiritsa ntchito ndikusiyanitsa chipikacho kuchokera ku malonda kapena deta ina. Pa block mtengo uwu ndi 1.

BlockHeight imasunga kutalika kwa chipikacho.
Chidindo cha nthawi.
HeaderSize ndi kukula kwa block muma byte.
PrevBlockHash ndiye hashi ya block yapitayi, ndipo SelfBlockHash ndiye hashi wapano.
TxsHash ndi chiwopsezo chambiri chazochitika.
MerkleRoot ndiye muzu wa mtengo wa Merkle.

Kupitilira m'minda pali kiyi yapagulu ya wopanga block, siginecha ya mlengi, mtundu wa block, kuchuluka kwa zomwe zachitika mu block, ndi zochitika izi zokha.

Tiyeni tiwone njira zake:
Kuti mupange chipika, gwiritsani ntchito block.NewBlock() ntchito: NewBlock(prevBlockHash string, height int) *Block, yomwe imatenga hashi ya chipika chapitacho ndi kutalika kwake kwa chipika chopangidwa mu blockchain. Mtundu wa block umayikidwanso kuchokera pamitundu phukusi lokhazikika:

b.DataType = types.BLOCK_TYPE.

Njira ya AddTx(tx *transaction.TX) imawonjezera kugulitsa ku block.

Njira ya Build () imakweza mitengo m'magawo a block ndikupanga ndikuyika hashi yake yamakono.

Njira ya ToBytesHeader() []byte imatembenuza mutu wa block (popanda kusintha) kukhala kagawo kakang'ono.

Njira ya chingwe cha ToJSON() imatembenuza chipikacho kukhala mtundu wa JSON mu chiwonetsero cha zingwezo.

Njira yolakwika ya FromJSON(data []byte) imanyamula data kuchokera ku JSON kupita ku block.

Njira ya Check () bool imapanga hashi ya block ndikuyifananitsa ndi yomwe yatchulidwa mu block hash field.

Njira ya chingwe ya GetTxsHash () imabweretsanso hashi yonse yazochitika zonse mu block.

Njira ya GetMerkleRoot () imatchula muzu wa mtengo wa Merkle pochita zinthu mu block.

Njira ya Sign(privk string) imasaina chipika ndi kiyi yachinsinsi ya wopanga block.

Njira ya SetHeight (utali wa int) imalemba kutalika kwa chipika kupita kumunda wa block block.

Njira ya GetHeight () int imabwezeretsa kutalika kwa chipika monga momwe zafotokozedwera m'gawo lofananira la block block.

Njira ya ToGOBBytes() []byte imayika chipika mumtundu wa GOB ndikuchibwezeretsa ngati kagawo kakang'ono.

Njira yolakwika ya FromGOBBytes(data []byte) imalemba data ya block ku block structure kuchokera pagawo lodutsa mumtundu wa GOB.

Njira ya chingwe ya GetHash () imabwezera hashi ya block yomwe wapatsidwa.

Njira yachingwe ya GetPrevHash () imabwezera hashi ya chipika chapitacho.

Njira ya SetPublicKey(pubk string) imalemba kiyi yapagulu ya wopanga block ku block.

Chifukwa chake, pogwiritsa ntchito njira za block block, titha kusintha mosavuta kukhala mawonekedwe otumizira pamaneti ndikusunga ku database ya LevelDB.

Ntchito za phukusi la blockchain zili ndi udindo wopulumutsa ku blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Kuti muchite izi, block iyenera kukhazikitsa mawonekedwe a IBlock:

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

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

}

Kulumikizana kwa database kumapangidwa kamodzi pomwe phukusi limakhazikitsidwa mu init() ntchito:

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

CloseDB () ndi wrapper ya db.Cloce () - yotchedwa pambuyo pogwira ntchito ndi phukusi kuti atseke kugwirizana kwa deta.

Cholakwika cha SetTargetBlockHash(hash string) chimalemba hashi ya chipika chapano ndi kiyi yotchulidwa ndi BLOCK_HASH nthawi zonse ku database.

Ntchito ya GetTargetBlockHash () (chingwe, cholakwika) imabwezera hashi ya block yomwe yasungidwa mu database.

Cholakwika cha SetTargetBlockHeight(height int) chimalembera ku database mtengo wa blockchain kutalika kwa node ndi kiyi yotchulidwa ndi BLOCK_HEIGHT mosalekeza.

Ntchito ya GetTargetBlockHeight () (int, error) imabwezeretsa kutalika kwa blockchain kwa node yopatsidwa, yosungidwa mu database.

Ntchito ya bool ya CheckBlock(block IBlock) imayang'ana chipika cholondola musanawonjezere chipikachi ku blockchain.

Cholakwika cha AddBlock(block IBlock) chimawonjezera chipika ku blockchain.

Ntchito zobweza ndikuwonera midadada zili mu fayilo ya explore.go ya phukusi la blockchain:

The GetBlockByHash(hash string) (* block.Block, error) ntchito imapanga chinthu chopanda kanthu, imanyamula chipika kuchokera ku database, hashi yomwe idaperekedwa kwa icho, ndikubwezeretsa cholozera kwa icho.

Kulengedwa kwa chipika cha genesis kumachitika ndi Genesis () ntchito yolakwika kuchokera ku fayilo ya genesis.go ya phukusi la blockchain.

Nkhani yotsatira ilankhula za kulumikiza makasitomala ku node pogwiritsa ntchito makina a WebSocket.

Source: www.habr.com

Kuwonjezera ndemanga