Kuti pakupedzisira tigadzire blockchain uye kwete dhatabhesi chete, isu tinofanirwa kuwedzera zvinhu zvitatu zvakakosha kupurojekiti yedu:
- Tsanangudzo ye data data uye nzira dze block
- Tsanangudzo yechimiro chedata uye nzira dzekutengesa
- Blockchain mabasa anochengeta zvidhinha mudhatabhesi uye wozviwana ipapo nehashi yavo kana kureba (kana imwe nzira).

Ichi ndicho chinyorwa chechipiri nezve blockchain yeindasitiri, yekutanga .
Ndichirangarira mibvunzo yakabvunzwa nevaverengi nezve chinyorwa chakapfuura mune ino nhevedzano, zvakakosha kuziva: LevelDB inoshandiswa kuchengetedza blockchain data mune iyi kesi, asi hapana chinokumisa kubva kushandisa chero imwe dhatabhesi, seMySQL. Zvino ngatitarisei chimiro che data iyi.
Ngatitange nekutengesa:
Heino data rayo chimiro:
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 inochengetedza rudzi rwe data (yekutengeserana 2), iyo transaction hashi, iyo yekutengeserana mhando pachayo, chitambi chenguva, pamwe nezvinopinza uye zvinobuda. TxIn inopinza inochengeta hashi yeinotaridzirwa transaction inobuda, nhamba yekubuda, uye bytecode, nepo TxOut zvinobuda zvichichengeta kukosha uyezve bytecode.
Iye zvino ngatitarisei zviito izvo kutengeserana kunogona kuita pane yayo data, i.e., ngationgororei nzira.
Kuti ugadzire kutengeserana, shandisa basa rekutengeserana.NewTransaction(txtype byte) *TX.
Iyo AddTxIn(thattxhash[]byte, txoutn int, kodhi[]byte)(*TxIn, kukanganisa) nzira inowedzera inopinza mukutengeserana.
Iyo AddTxOut(value int, data []byte) (* TxOut, kukanganisa) nzira inowedzera inobuda kune kutengeserana.
Iyo ToBytes()[]byte nzira inoshandura kutengeserana kuita chidimbu chebyte.
Iyo yemukati basa preByteHash(bytes []byte) tambo inoshandiswa muBuild() uye Tarisa() kuita kuti inogadzirwa transaction hashi ienderane netransaction hashes inogadzirwa kubva kuJavaScript application.
Iyo Build() nzira inoseta kutengeserana hashi sezvinotevera: tx.TxHash = preByteHash(tx.ToBytes()).
Iyo ToJSON () tambo nzira inoshandura kutengeserana kuita JSON tambo.
Iyo FromJSON(data []byte) kukanganisa nzira inotakura transaction kubva kuJSON fomati yakapfuura sebyte slice.
Iyo Cheki() bool nzira inofananidza iyo hashi inoguma kubva kumunda wekutengesa hashi nehashi yakawanikwa nehashi iyi kutengeserana (kusanganisa iyo hashi munda).
Transactions inowedzerwa kune block:
Iyo block data chimiro chakanyanya kuvhurika:
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 inochengetedza rudzi rwe data, iyo node inoshandisa kusiyanisa block kubva kune kutengeserana kana imwe data. Kubhuroka, kukosha uku ndi1.
BlockHeight inochengetedza kureba kwebhuroka.
Chitambi chenguva.
HeaderSize ndiyo saizi yebhuroka mumabhayiti.
PrevBlockHash ndiyo hashi yeblock yapfuura, uye SelfBlockHash ndiyo hashi yebhuroko razvino.
TxsHash ndiyo yakagovaniswa kutengeserana hashi.
MerkleRoot ndiwo mudzi wemuti weMerkle.
Aya minda anotevera ane kiyi yeruzhinji yemusiki, siginecha yemugadziri, vhezheni yebhuroka, nhamba yekutengeserana mubhuroka, uye mabatiro acho pachawo.
Ngatitarisei nzira dzake:
Kugadzira bhuroka, shandisa block.NewBlock() basa: NewBlock(prevBlockHash tambo, urefu int) *Block, iyo inogamuchira hashi yebhuroko rapfuura uye kureba kwakaiswa kwechivharo chakasikwa mu blockchain. Iyo block type inotsanangurwa zvakare kubva kumhando dzepakeji nguva dzose:
b.DataType = types.BLOCK_TYPE.Iyo AddTx(tx *transaction.TX) nzira inowedzera kutengeserana kune block.
Iyo Build () nzira inoremedza kukosha muminda yeblock uye inogadzira uye inoseta hashi yayo iripo.
Iyo ToBytesHeader()[]byte nzira inoshandura musoro weblock (pasina kutengeserana) kuita chidimbu chebyte.
Iyo ToJSON () tambo nzira inoshandura bhuroka kuita JSON fomati mukumiririra tambo yedata.
Iyo FromJSON(data []byte) yekukanganisa nzira inotakura data kubva kuJSON kuita mubhuroka chimiro.
Iyo Cheki () bool nzira inogadzira block hash uye inoienzanisa neinotsanangurwa mu block hash field.
Iyo GetTxsHash () tambo nzira inodzosa iyo yakazara hashi yezvese kutengeserana mubhuroka.
Iyo GetMerkleRoot () nzira inoisa mudzi weMerkle muti wekutengesa mubhuroka.
Iyo Sign(privk tambo) nzira inosaina bhuroko nekiyi yakavanzika yemugadziri.
Iyo SetHeight (kureba int) nzira inonyora iyo block urefu kune iyo block chimiro ndima.
Iyo GetHeight () int nzira inodzosa kureba kwechivharo sezvakatsanangurwa mumunda unoenderana weiyo block chimiro.
Iyo ToGOBBytes() []byte nzira inoisa bhuroko muGOB fomati uye inoidzosera sechidimbu chebyte.
Iyo FromGOBBytes(data []byte) nzira yekukanganisa inonyora block data kune block chimiro kubva pane yakapfuura GOB-yakarongwa byte slice.
Iyo GetHash () tambo nzira inodzosa iyo hashi ye block yakapihwa.
Iyo GetPrevHash () tambo nzira inodzosera iyo hashi yeyakapfuura block.
Iyo SetPublicKey(pubk tambo) nzira inonyora kiyi yeruzhinji yemugadziri we block kune block.
Saka, tichishandisa nzira dzeBlock chinhu, tinogona kuishandura zviri nyore kuita fomati yekutapurirana pamusoro petiweki uye nekuichengeta kune LevelDB dhatabhesi.
Aya anotevera mabasa eiyo blockchain package ane basa rekuchengetedza kune blockchain:
Kuti uite izvi, iyo block inofanirwa kuita iyo IBlock interface:
type IGOBBytes interface {
ToGOBBytes() []byte
FromGOBBytes(data []byte) error
}
type IBlock interface {
IGOBBytes
GetHash() string
GetPrevHash() string
GetHeight() int
Check() bool
}Iyo dhatabhesi yekubatanidza inogadzirwa kamwe kana iyo package yatangwa muinit () basa:
db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).CloseDB() is a wrapper ye db.Cloce() - inodanwa mushure mekushanda nemapasuru mabasa kuvhara kubatana kune database.
Iyo SetTargetBlockHash(hash string) kukanganisa basa inonyora hashi yebhuroko iripo kudhatabhesi nekiyi inotsanangurwa neBLOCK_HASH nguva dzose.
Iyo GetTargetBlockHash() basa (tambo, kukanganisa) inodzosa hashi yebhuroko razvino rakachengetwa mudhatabhesi.
Iyo SetTargetBlockHeight(kureba int) kukanganisa basa inonyora kukosha kwe blockchain kureba kune dhatabhesi yenodhi ine kiyi inotsanangurwa neBLOCK_HEIGHT nguva dzose.
Iyo GetTargetBlockHeight () (int, kukanganisa) basa rinodzosera kureba kweblockchain kune node yakapihwa, yakachengetwa mudhatabhesi.
Iyo CheckBlock (block IBlock) bool basa inotarisa chivharo kuti charongeka isati yawedzera iyo block kune blockchain.
Iyo AddBlock (block IBlock) kukanganisa basa inowedzera bhuroka ku blockchain.
Iwo mabasa ekudzoreredza uye ekuona zvidhinha ari muexplore.go faira re blockchain package:
The GetBlockByHash(hash string) (* block.Block, error) basa rinogadzira chinhu chisina chinhu, chinotakura chivharo kubva mudhatabhesi iro hashi inopfuudzwa kwairi, uye inodzorera pointer kwairi.
Kusikwa kweiyo genesis block kunoitwa neGenesis () kukanganisa basa kubva kugenesis.go faira re blockchain package.
Chinyorwa chinotevera chichakurukura kubatanidza vatengi kune node uchishandisa iyo WebSocket mechanism.
Source: www.habr.com
