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).
ʻO kēia ka ʻatikala ʻelua e pili ana i ka blockchain no ka ʻoihana, ʻo ka mua
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:
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:
ʻ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:
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