Чӣ гуна ман блокҳо ва транзаксияҳоро дар blockchain Go-и худ тарҳрезӣ кардам

Барои он ки дар ниҳоят бо блокчейн ба анҷом расад, на танҳо пойгоҳи додаҳо, мо бояд ба лоиҳаи худ 3 унсури муҳимро илова кунем:

  • Тавсифи сохтори маълумотҳои блок ва усулҳо
  • Тавсифи сохтори додаҳо ва усулҳои транзаксия
  • Функсияҳои Blockchain, ки блокҳоро дар пойгоҳи додаҳо захира мекунанд ва онҳоро аз рӯи хэш ё баландии худ (ё чизи дигар) дар он ҷо пайдо мекунанд.

Чӣ гуна ман блокҳо ва транзаксияҳоро дар blockchain Go-и худ тарҳрезӣ кардам

Ин мақолаи дуюм дар бораи blockchain барои саноат, якум аст дар ин ҷо.

Саволҳоеро, ки хонандагон ба ман дар бораи мақолаи қаблии ин силсила дода буданд, ба ёд оварда, бояд қайд кард: дар ин ҳолат, пойгоҳи додаҳои LevelDB барои нигоҳ доштани маълумоти blockchain истифода мешавад, аммо ҳеҷ чиз шуморо аз истифодаи ягон чизи дигар, масалан, MySQL манъ намекунад. Акнун биёед ба сохтори ин маълумот назар андозем.

Биёед бо транзаксияҳо оғоз кунем: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Ин аст сохтори маълумоти он:

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() хэши ҳосилшударо аз майдони хэши транзаксия бо хэши дар натиҷаи хэшкунии ин транзаксия ба даст овардашуда муқоиса мекунад (майдони ҳашро сарфи назар мекунад).

Муомилот ба блок илова карда мешаванд: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Сохтори маълумоти блок ҳаҷмноктар аст:

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 масъуланд: github.com/Rusldv/bcstartup/tree/master/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

Илова Эзоҳ