Ina ia iu lava ina iʻu i se poloka poloka ae le naʻo se faʻamaumauga, matou te manaʻomia le faʻaopoopoina o elemene taua 3 i la matou poloketi:
- Faʻamatalaga o faʻamaumauga poloka poloka ma metotia
- Faʻamatalaga o faʻamaumauga faʻamaumauga ma auala tau fefaʻatauaiga
- Blockchain galuega e faʻasaoina poloka i totonu o se faʻamaumauga ma maua ai iina e ala i la latou hash poʻo le maualuga (poʻo se isi mea).
Ole tala lona lua lea e uiga ile poloka poloka mo alamanuia, muamua
O le manatuaina o fesili na fesiligia ai aʻu e le au faitau e uiga i le tusiga muamua i lenei faasologa, e tatau ona maitauina: i lenei tulaga, o le LevelDB database e faʻaaogaina e teu ai faʻamaumauga poloka poloka, ae leai se mea e taofia ai oe mai le faʻaaogaina o se isi, fai mai, MySQL. Se'i o tatou va'ava'ai i le fa'atulagaina o fa'amaumauga nei.
Tatou amata i fefa'atauaiga:
O lona fausaga fa'amaumauga lea:
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 teuina le ituaiga faʻamatalaga (mo fefaʻatauaiga 2), o le hash o lena fefaʻatauaiga, le ituaiga o fefaʻatauaiga lava ia, se faailoga taimi, ma mea e fai ma mea e fai. TxIn mea fa'aoga e teu ai le hash o le fefa'ataua'iga o lo'o fa'asino i ai, le numera o lenei galuega ma le bytecode, ma TxOut galuega fa'aopoopo e teu ai sina tau ma le bytecode.
Se'i o tatou va'ai po'o a gaioiga e mafai e se fefa'ataua'iga ona faia i luga o ana fa'amaumauga, i.e. Sei o tatou vaavaai i metotia.
Ina ia faia se fefaʻatauaiga, faʻaaoga le fefaʻatauaiga.NewTransaction(txtype byte) *TX galuega.
O le AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) e faʻaopoopoina ai se faʻaoga i le fefaʻatauaiga.
O le AddTxOut(value int, data []byte) (*TxOut, error) e fa'aopoopoina ai se gaioiga i le fefa'atauaiga.
O le ToBytes() []byte method e fa'aliliuina ai le fefa'ataua'iga i se fasi byte.
O le galuega i totonu preByteHash(bytes []byte) manoa o loʻo faʻaaogaina i le Fausia () ma le Siaki () e faʻaogaina ai le faʻasalalauga faʻatauga faʻatasi ma faʻamatalaga faʻatau na gaosia mai talosaga JavaScript.
O le Build() method e fa'atulaga ai le fa'atauga o fefa'atauaiga e fa'apea: tx.TxHash = preByteHash(tx.ToBytes()).
O le ToJSON() string method e liua ai se fefa'ataua'iga i se manoa JSON.
O le FromJSON(data []byte) auala sese e utaina ai se fefaʻatauaiga mai le JSON faʻasologa na pasia o se fasi byte.
O le Check() bool method e fa'atusatusaina ai le hash e maua mai le fanua hash transaction ma le hash na maua ona o le fa'afefeina o lenei fefa'ataua'iga (le amana'ia le fanua hash).
O fefa'atauaiga ua fa'aopoopo i le poloka:
O le fausaga o faʻamaumauga poloka e sili atu le voluminous:
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 teuina le ituaiga faʻamatalaga, faʻaaogaina e le node ma faʻaeseese le poloka mai se fefaʻatauaiga poʻo isi faʻamatalaga. Mo se poloka o lenei tau e 1.
BlockHeight e teuina le maualuga o le poloka.
Faailoga taimi.
HeaderSize o le tele poloka i paita.
PrevBlockHash o le hash o le poloka muamua, ma SelfBlockHash o le hash o le taimi nei.
TxsHash o se faʻasalalauga lautele o fefaʻatauaiga.
MerkleRoot o le a'a o le laau Merkle.
E le gata i lea i totonu o fanua o loʻo i ai le ki lautele a le na faia le poloka, le saini a le na faia, le faʻasologa o le poloka, le numera o fefaʻatauaiga i totonu o le poloka, ma nei fefaʻatauaiga lava ia.
Se'io tatou va'ai i ona metotia:
Ina ia faia se poloka, faʻaaoga le poloka.NewBlock() galuega: NewBlock(prevBlockHash manoa, maualuga int) *Polo, lea e ave ai le hash o le poloka muamua ma le maualuga seti mo le poloka na faia i le poloka poloka. O le ituaiga poloka e seti foi mai le ituaiga afifi tumau:
b.DataType = types.BLOCK_TYPE.
O le AddTx(tx *transaction.TX) auala e faʻaopoopoina ai se fefaʻatauaiga i se poloka.
O le Build() auala e utaina ai tau i totonu o fanua o le poloka ma faʻatupuina ma seti lona hash o loʻo iai nei.
O le ToBytesHeader() []byte method e liua ai le ulutala poloka (e aunoa ma ni fefa'ataua'iga) i totonu o se fasi byte.
O le ToJSON() string method e liua ai le poloka i le JSON format i se manoa faʻatusa o faʻamatalaga.
O le FromJSON(data []byte) auala sese e utaina faʻamaumauga mai le JSON i se fausaga poloka.
O le Check() bool method e fa'atupuina ai se poloka poloka ma fa'atusatusa i le tasi o lo'o fa'amaoti mai ile poloka poloka poloka.
O le GetTxsHash() string method e toe fa'afo'i ai le aofa'i o fa'atauga uma i totonu o le poloka.
O le GetMerkleRoot() auala e faʻamaonia ai le aʻa o le laau Merkle mo fefaʻatauaiga i totonu o se poloka.
O le auala Fa'ailoga(privk string) e saini ai se poloka i le ki patino a le tagata na faia poloka.
O le SetHeight(maualuga int) metotia e tusia ai le maualuga o le poloka i le poloka fausaga fanua.
O le GetHeight() int method e toe fa'afo'i mai ai le maualuga o le poloka e pei ona fa'ailoa mai i totonu o le fanua fa'atatau o le fausaga poloka.
O le ToGOBBytes() []byte method e fa'ailoga poloka i le GOB fa'atulagaina ma toe fa'afo'i mai e pei o se fasi byte.
Ole auala sese ole FromGOBBytes(data []byte) e tusia ai fa'amaumauga poloka ile fausaga poloka mai le fasi byte ua pasia ile faatulagaga GOB.
O le GetHash() string method e toe fa'afo'i ai le hash o le poloka ua tu'uina atu.
O le GetPrevHash() string method e toe faafoi mai ai le hash o le poloka muamua.
Ole SetPublicKey(pubk string) e tusi ai le ki fa'alaua'itele a le tagata na faia poloka ile poloka.
O le mea lea, i le faʻaaogaina o metotia o le mea Block, e mafai ona faigofie ona tatou faʻaliliuina i se faatulagaga mo le faʻasalalau i luga o le upega tafaʻilagi ma sefe i le LevelDB database.
O galuega a le poloka poloka poloka e nafa ma le teuina i le poloka poloka:
Ina ia faia lenei mea, e tatau i le poloka ona faʻaogaina le IBlock interface:
type IGOBBytes interface {
ToGOBBytes() []byte
FromGOBBytes(data []byte) error
}
type IBlock interface {
IGOBBytes
GetHash() string
GetPrevHash() string
GetHeight() int
Check() bool
}
Ole feso'ota'iga fa'amaumauga e faia i le taimi e amata ai le afifi ile init() galuega:
db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).
CloseDB () o se afifi mo db.Cloce () - valaau pe a uma ona galue ma le afifi galuega tauave e tapunia le sootaga i le database.
O le SetTargetBlockHash (hash string) galuega sese e tusia ai le hash o le poloka o loʻo iai nei ma le ki faʻamaonia e le BLOCK_HASH tumau i le database.
O le galuega GetTargetBlockHash() ( manoa, sese) e toe faafoi ai le hash o le poloka o loʻo iai nei o loʻo teuina i totonu o faʻamaumauga.
O le SetTargetBlockHeight(maualuga int) sese galuega e tusi i le database le tau o le maualuga poloka poloka mo le node ma le ki faʻamaonia e le BLOCK_HEIGHT tumau.
O le GetTargetBlockHeight() (int, error) galuega e toe faafoi mai ai le maualuga o le poloka poloka mo se node ua tuʻuina atu, teuina i totonu o faʻamaumauga.
Ole CheckBlock(block IBlock) bool function e siaki ai se poloka mo le sa'o a'o le'i fa'aopoopoina le poloka lea ile poloka poloka.
Ole galuega sese ole AddBlock(block IBlock) e fa'aopoopoina se poloka ile poloka poloka.
O galuega mo le toe aumai ma le matamataina o poloka o loʻo i le faila explore.go o le poloka poloka poloka:
O le GetBlockByHash(hash string) (*block.Block, error) galuega e faia ai se mea poloka poloka gaogao, utaina se poloka mai le database o lona hash na pasi atu i ai ma toe faafoi atu se faasinoala i ai.
O le fausiaina o se poloka genesis o loʻo faʻatinoina e le Kenese () galuega sese mai le genesis.go faila o le poloka poloka poloka.
O le isi tusiga o le a talanoa e uiga i le faʻafesoʻotaʻi o tagata faʻatau i se node e faʻaaoga ai le WebSocket mechanism.
puna: www.habr.com