Барои он ки дар ниҳоят бо блокчейн ба анҷом расад, на танҳо пойгоҳи додаҳо, мо бояд ба лоиҳаи худ 3 унсури муҳимро илова кунем:
- Тавсифи сохтори маълумотҳои блок ва усулҳо
- Тавсифи сохтори додаҳо ва усулҳои транзаксия
- Функсияҳои Blockchain, ки блокҳоро дар пойгоҳи додаҳо захира мекунанд ва онҳоро аз рӯи хэш ё баландии худ (ё чизи дигар) дар он ҷо пайдо мекунанд.
Ин мақолаи дуюм дар бораи blockchain барои саноат, якум аст
Саволҳоеро, ки хонандагон ба ман дар бораи мақолаи қаблии ин силсила дода буданд, ба ёд оварда, бояд қайд кард: дар ин ҳолат, пойгоҳи додаҳои LevelDB барои нигоҳ доштани маълумоти blockchain истифода мешавад, аммо ҳеҷ чиз шуморо аз истифодаи ягон чизи дигар, масалан, MySQL манъ намекунад. Акнун биёед ба сохтори ин маълумот назар андозем.
Биёед бо транзаксияҳо оғоз кунем:
Ин аст сохтори маълумоти он:
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 навъи маълумотро (барои транзаксияи 2), хэши ин транзаксия, навъи худи транзаксия, тамғаи вақт ва вуруду натиҷаҳоро нигоҳ медорад. Вурудҳои TxIn хэши транзаксияро, ки баромади он истинод шудааст, рақами ин баромад ва байткодро нигоҳ медорад ва баромадҳои TxOut баъзе арзишҳо ва инчунин байткодро нигоҳ медоранд.
Акнун биёед бубинем, ки транзаксия дар маълумоти худ чӣ гуна амалҳоро иҷро карда метавонад, яъне. Биёед усулҳоро дида бароем.
Барои эҷод кардани транзаксия, функсияи транзаксияро истифода баред.NewTransaction(txtype byte) *TX.
Усули AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) воридотро ба транзаксия илова мекунад.
Усули AddTxOut(value int, data []byte) (*TxOut, error) натиҷаро ба транзаксия илова мекунад.
Усули ToBytes() []байт транзаксияро ба як буридаи байт табдил медиҳад.
Функсияи дохилии сатри preByteHash(байт []байт) дар Build() ва Check() истифода мешавад, то хэши транзакцияи тавлидшуда бо хэшҳои транзаксияҳои аз барномаҳои JavaScript тавлидшуда мувофиқ бошад.
Усули Build() хэши транзаксияро ба таври зерин муқаррар мекунад: tx.TxHash = preByteHash(tx.ToBytes()).
Усули сатри ToJSON() транзаксияро ба сатри JSON табдил медиҳад.
Усули хатои FromJSON(data []byte) транзаксияро аз формати JSON, ки ҳамчун буридаи байт интиқол дода шудааст, бор мекунад.
Усули bool Check() хэши ҳосилшударо аз майдони хэши транзаксия бо хэши дар натиҷаи хэшкунии ин транзаксия ба даст овардашуда муқоиса мекунад (майдони ҳашро сарфи назар мекунад).
Муомилот ба блок илова карда мешаванд:
Сохтори маълумоти блок ҳаҷмноктар аст:
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 намуди маълумотро нигоҳ медорад, гиреҳ онро истифода мебарад ва блокро аз транзаксия ё дигар маълумот фарқ мекунад. Барои блок ин арзиш 1 аст.
BlockHeight баландии блокро нигоҳ медорад.
Тамғаи вақт.
HeaderSize андозаи блок бо байт аст.
PrevBlockHash хэши блоки қаблӣ ва SelfBlockHash хэши блоки ҷорӣ аст.
TxsHash як хэш умумии муомилот аст.
MerkleRoot решаи дарахти Merkle аст.
Минбаъд дар майдонҳо калиди кушодаи эҷодкунандаи блок, имзои созанда, версияи блок, шумораи транзаксияҳо дар блок ва худи ин транзаксияҳо мавҷуданд.
Биёед усулҳои онро дида бароем:
Барои сохтани блок, функсияи block.NewBlock()-ро истифода баред: NewBlock(сатри prevBlockHash, height int) *Блок, ки хэши блоки қаблӣ ва баландии муқарраршударо барои блоки сохта дар blockchain мегирад. Навъи блок инчунин аз константаҳои бастаи намудҳо муқаррар карда мешавад:
b.DataType = types.BLOCK_TYPE.
Усули AddTx(tx *transaction.TX) транзаксияро ба блок илова мекунад.
Усули Build () арзишҳоро ба майдонҳои блок бор мекунад ва хэши ҷории онро тавлид ва муқаррар мекунад.
Усули ToBytesHeader() []байт сарлавҳаи блокро (бе транзаксия) ба як буридаи байт табдил медиҳад.
Усули сатри ToJSON() блокро ба формати JSON дар намоиши сатри маълумот табдил медиҳад.
Усули хатои FromJSON(data []byte) маълумотро аз JSON ба сохтори блок бор мекунад.
Усули bool Check() хэши блокро тавлид мекунад ва онро бо усули дар майдони ҳаши блок нишондодашуда муқоиса мекунад.
Усули сатри GetTxsHash() хэши умумии ҳамаи транзаксияҳоро дар блок бармегардонад.
Усули GetMerkleRoot() решаи дарахти Merkleро барои муомилот дар блок муайян мекунад.
Усули Sign(privk string) блокро бо калиди хусусии созандаи блок имзо мекунад.
Усули SetHeight(height int) баландии блокро ба майдони сохтори блок менависад.
Усули GetHeight() int баландии блокро тавре бармегардонад, ки дар майдони мувофиқи сохтори блок нишон дода шудааст.
Усули ToGOBBytes() []байт блокро дар формати GOB рамзгузорӣ мекунад ва онро ҳамчун буридаи байт бармегардонад.
Усули хатои FromGOBBytes(data []byte) маълумоти блокро ба сохтори блок аз буридаи байтҳои гузаронидашуда дар формати GOB менависад.
Усули сатри GetHash() хэши блоки додашударо бармегардонад.
Усули сатри GetPrevHash() хэши блоки қаблиро бармегардонад.
Усули SetPublicKey(pubk string) калиди оммавии созандаи блокро ба блок менависад.
Ҳамин тариқ, бо истифода аз усулҳои объекти Блок, мо метавонем онро ба осонӣ ба формат барои интиқол тавассути шабака ва захира кардан ба пойгоҳи додаҳои LevelDB табдил диҳем.
Функсияҳои бастаи blockchain барои захира кардан ба blockchain масъуланд:
Барои ин, блок бояд интерфейси IBlock -ро татбиқ кунад:
type IGOBBytes interface {
ToGOBBytes() []byte
FromGOBBytes(data []byte) error
}
type IBlock interface {
IGOBBytes
GetHash() string
GetPrevHash() string
GetHeight() int
Check() bool
}
Пайвастшавӣ ба пойгоҳи додаҳо як маротиба ҳангоми оғоз кардани баста дар функсияи init() сохта мешавад:
db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).
CloseDB() як парпеч барои db.Cloce () аст - пас аз кор бо функсияҳои баста барои бастани пайвастшавӣ ба пойгоҳи додаҳо даъват карда мешавад.
Функсияи хатогии SetTargetBlockHash(хатти hash) хэши блоки ҷорӣро бо калиди муайянкардаи BLOCK_HASH доимӣ ба пойгоҳи додаҳо менависад.
Функсияи GetTargetBlockHash() (сатр, хато) хэши блоки ҷориро, ки дар пойгоҳи додаҳо нигоҳ дошта шудааст, бармегардонад.
Функсияи хатогии SetTargetBlockHeight(height int) ба базаи маълумот арзиши баландии блокчейнро барои гиреҳ бо калиди муайянкардаи доимии BLOCK_HEIGHT менависад.
Функсияи GetTargetBlockHeight() (int, error) баландии блокчейнро барои гиреҳи додашуда, ки дар пойгоҳи додаҳо нигоҳ дошта мешавад, бармегардонад.
Функсияи bool CheckBlock(block IBlock) пеш аз илова кардани ин блок ба blockchain дурустии блокро тафтиш мекунад.
Функсияи хатогии AddBlock(block IBlock) ба blockchain блок илова мекунад.
Функсияҳои ҷустуҷӯ ва дидани блокҳо дар файли explore.go бастаи blockchain мавҷуданд:
Функсияи GetBlockByHash(хатти hash) (*block.Block, error) объекти блоки холӣ эҷод мекунад, блокро аз базаи маълумот ба он бор мекунад, ки хэши он ба он интиқол дода шудааст ва нишондиҳандаро ба он бармегардонад.
Эҷоди блоки генезис аз ҷониби функсияи хатогии Genesis() аз файли genesis.go бастаи blockchain амалӣ карда мешавад.
Дар мақолаи навбатӣ дар бораи пайваст кардани мизоҷон ба гиреҳ бо истифода аз механизми WebSocket сухан меравад.
Манбаъ: will.com