Pehea wau i hoʻolālā ai i nā poloka a me nā kālepa i kaʻu Go blockchain

I mea e hoʻopau ai i kahi blockchain a ʻaʻole i kahi waihona wale nō, pono mākou e hoʻohui i 3 mau mea nui i kā mākou papahana:

  • ʻO ka wehewehe ʻana i ka hoʻolālā ʻikepili poloka a me nā ʻano hana
  • ʻO ka wehewehe ʻana i ke ʻano o ka ʻikepili a me nā ʻano hana kālepa
  • Nā hana Blockchain e mālama i nā poloka i loko o kahi waihona a loaʻa iā lākou ma laila ma ko lākou hash a kiʻekiʻe (a i ʻole kekahi mea ʻē aʻe).

Pehea wau i hoʻolālā ai i nā poloka a me nā kālepa i kaʻu Go blockchain

ʻO kēia ka ʻatikala ʻelua e pili ana i ka blockchain no ka ʻoihana, ʻo ka mua maanei.

Ke hoʻomanaʻo nei i nā nīnau a ka poʻe heluhelu i nīnau mai iaʻu e pili ana i ka ʻatikala ma mua o kēia pūʻulu, pono e hoʻomaopopo ʻia: i kēia hihia, hoʻohana ʻia ka waihona LevelDB e mālama i ka ʻikepili blockchain, akā ʻaʻohe mea e pale iā ʻoe mai ka hoʻohana ʻana i nā mea ʻē aʻe, e ʻōlelo, MySQL. I kēia manawa, e nānā kākou i ke ʻano o kēia ʻikepili.

E hoʻomaka kākou me nā kālepa: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Eia kona ʻano ʻikepili:

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
}

Mālama ʻo TX i ke ʻano ʻikepili (no ke kālepa 2), ka hash o kēlā kālepa, ke ʻano o ke kālepa ponoʻī, kahi hōʻailona manawa, a me nā mea hoʻokomo a me nā huahana. Hoʻokomo nā mea hoʻokomo TxIn i ka hash o ka hana i kuhikuhi ʻia ka mea hoʻopuka, ka helu o kēia puka a me ka bytecode, a me nā huahana TxOut e mālama i kekahi waiwai a me ka bytecode.

I kēia manawa e ʻike kākou i nā hana e hiki ai i ke kālepa ke hana ma kāna ʻikepili, ʻo ia hoʻi. E nānā kākou i nā ʻano hana.

No ka hana ʻana i kahi kālepa, e hoʻohana i ka transaction.NewTransaction(txtype byte) *TX hana.

Hoʻohui ke ʻano AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) i kahi hoʻokomo i ke kālepa.

ʻO ke ala AddTxOut (waiwai int, data []byte) (*TxOut, error) e hoʻohui i kahi puka i ke kālepa.

ʻO ka ToBytes() []byte ala e hoʻololi i ke kālepa i kahi ʻāpana byte.

Hoʻohana ʻia ka hana kūloko preByteHash(bytes []byte) string i Build() a me Check() e hoʻohālikelike i ka hash transaction i hana ʻia me nā hashes kālepa i hana ʻia mai nā noi JavaScript.

Hoʻonohonoho ke ʻano hana () i ka hash kālepa penei: tx.TxHash = preByteHash(tx.ToBytes()).

Hoʻololi ke ala ToJSON () i kahi kālepa i kahi kaula JSON.

Hoʻouka ʻia ke ʻano hana hewa FromJSON(data []byte) i kahi kālepa mai ke ʻano JSON i hoʻolilo ʻia ma ke ʻano he ʻāpana byte.

Hoʻohālikelike ke ʻano o ka Check() bool i ka hash i loaʻa mai ke kahua hash transaction me ka hash i loaʻa ma muli o ka hashing i kēia kālepa (ka nānā ʻole ʻana i ke kahua hash).

Hoʻohui ʻia nā hana i ka poloka: github.com/Rusldv/bcstartup/blob/master/block/builder.go

ʻOi aku ka nui o ka hoʻolālā ʻikepili poloka:

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
}

Mālama ʻo DataType i ke ʻano ʻikepili, hoʻohana ka node a hoʻokaʻawale i ka poloka mai kahi kālepa a i ʻole nā ​​​​ʻikepili ʻē aʻe. No kahi poloka he 1 kēia waiwai.

Mālama ʻo BlockHeight i ke kiʻekiʻe o ka poloka.
Kaha manawa.
ʻO HeaderSize ka nui o ka poloka ma nā bytes.
ʻO PrevBlockHash ka hash o ka poloka mua, a ʻo SelfBlockHash ka hash o kēia manawa.
ʻO TxsHash kahi hash maʻamau o nā kālepa.
ʻO MerkleRoot ke kumu o ka lāʻau Merkle.

Aia i loko o nā māla ke kī ākea o ka mea nāna i hana i ka poloka, ka pūlima o ka mea nāna i hana, ka mana o ka poloka, ka helu o nā hana i loko o ka poloka, a me kēia mau hana pono'ī.

E nana kakou i kona mau ano:
No ka hana ʻana i kahi poloka, e hoʻohana i ka hana block.NewBlock(): NewBlock(prevBlockHash string, height int) *Block, e lawe ana i ka hash o ka poloka mua a me ke kiʻekiʻe i hoʻonohonoho ʻia no ka poloka i hana ʻia i loko o ka poloka. Hoʻonohonoho pū ʻia ke ʻano poloka mai nā ʻano pūʻolo mau:

b.DataType = types.BLOCK_TYPE.

Hoʻohui ke ʻano AddTx(tx *transaction.TX) i kahi kālepa i kahi poloka.

Hoʻokomo ke ʻano hana () i nā waiwai i loko o nā kahua o ka poloka a hana a hoʻonohonoho i kāna hash o kēia manawa.

Hoʻololi ka ToBytesHeader() []byte i ke poʻo poʻomanaʻo (me ka ʻole o nā kālepa) i kahi ʻāpana byte.

Hoʻololi ke ala ToJSON() i ka poloka i ke ʻano JSON ma kahi hōʻike string o ka ʻikepili.

Hoʻouka ʻia ka ʻikepili mai JSON mai ka FromJSON(data []byte) i loko o kahi ʻano poloka.

Hoʻokumu ke ʻano hana bool Check() i ka hash block a hoʻohālikelike ʻia me ka mea i kuhikuhi ʻia ma ka pā hash block.

Hoʻihoʻi ke ala GetTxsHash() i ka huina o nā hana a pau i loko o ka poloka.

ʻO ke ala GetMerkleRoot() e wehewehe i ke kumu o ka lāʻau Merkle no nā hana i loko o kahi poloka.

Hoʻopaʻa inoa ke ʻano hana hōʻailona (privk string) i kahi poloka me ke kī pilikino o ka mea nāna i hana.

Kākau ke ala SetHeight(height int) i ke kiʻekiʻe o ka poloka i ke kahua kūkulu poloka.

ʻO ke ala GetHeight() int e hoʻihoʻi i ke kiʻekiʻe o ka poloka e like me ka mea i ʻōlelo ʻia ma ke kahua kūpono o ka hale poloka.

Hoʻopili ke ʻano ToGOBBytes() []byte i kahi poloka ma ke ʻano GOB a hoʻihoʻi iā ia ma ke ʻano he ʻāpana byte.

ʻO ke ala kuhi hewa FromGOBBytes (data []byte) kākau i ka ʻikepili poloka i ka hoʻolālā poloka mai ka ʻāpana byte i hala ma ke ʻano GOB.

Hoʻihoʻi ke ala GetHash () i ka hash o ka poloka i hāʻawi ʻia.

Hoʻihoʻi ke ala GetPrevHash() i ka hash o ka poloka mua.

Na ke ʻano SetPublicKey(pubk string) e kākau i ke kī lehulehu o ka mea hana poloka i ka poloka.

No laila, me ka hoʻohana ʻana i nā ʻano o ka mea Block, hiki iā mākou ke hoʻololi maʻalahi iā ia i kahi ʻano no ka hoʻouna ʻana ma luna o ka pūnaewele a mālama i ka waihona LevelDB.

ʻO nā hana o ka pūʻolo blockchain ke kuleana no ka mālama ʻana i ka blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

No ka hana ʻana i kēia, pono e hoʻokō ka poloka i ka interface IBlock:

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

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

}

Hoʻokumu ʻia ka pilina waihona i hoʻokahi manawa ke hoʻomaka ʻia ka pūʻolo ma ka hana init():

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

ʻO CloseDB () kahi wīwī no db.Cloce () - kāhea ʻia ma hope o ka hana ʻana me nā hana pūʻolo e pani i ka pilina i ka waihona.

ʻO ka hana hewa SetTargetBlockHash (hash string) e kākau i ka hash o ka poloka o kēia manawa me ke kī i kuhikuhi ʻia e ka BLOCK_HASH mau i ka waihona.

Hoʻihoʻi ka hana GetTargetBlockHash () (kuino, hewa) i ka hash o ka poloka o kēia manawa i mālama ʻia i ka waihona.

ʻO ka hana hewa SetTargetBlockHeight(height int) kākau i ka waihona i ka waiwai o ke kiʻekiʻe blockchain no ka node me ke kī i kuhikuhi ʻia e ka BLOCK_HEIGHT mau.

ʻO ka hana GetTargetBlockHeight() (int, error) e hoʻihoʻi i ke kiʻekiʻe o ka blockchain no kahi node i hāʻawi ʻia, i mālama ʻia i ka waihona.

Na ka CheckBlock(block IBlock) bool function e nānā i kahi poloka no ka pololei ma mua o ka hoʻohui ʻana i kēia poloka i ka blockchain.

Hoʻohui ka hana hewa AddBlock(block IBlock) i kahi poloka i ka blockchain.

Aia nā hana no ka hoʻihoʻi ʻana a me ka nānā ʻana i nā poloka ma ka faila explore.go o ka pūʻolo blockchain:

Hoʻokumu ka GetBlockByHash(hash string) (* block.Block, error) i kahi mea poloka ʻole, hoʻouka i kahi poloka i loko mai ka waihona, ua hāʻawi ʻia ka hash iā ia, a hoʻihoʻi i kahi kuhikuhi iā ia.

Hana ʻia ka hana ʻana i kahi poloka genesis e ka hana hewa ʻo Genesis() mai ka faila genesis.go o ka pūʻolo blockchain.

E kamaʻilio ka ʻatikala aʻe e pili ana i ka hoʻopili ʻana i nā mea kūʻai aku i kahi node me ka hoʻohana ʻana i ka mīkini WebSocket.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka