Dina raraga pamustunganana nyieun blockchain a teu ngan database a, urang kudu nambahan 3 elemen penting pikeun proyék urang:
- Katerangan ngeunaan struktur data sareng metode blok
- Pedaran ngeunaan struktur data jeung métode transaksi
- Fungsi Blockchain anu nyimpen blok dina pangkalan data sareng mendakanana di dinya ku hash atanapi jangkungna (atanapi cara anu sanés).

Ieu mangrupikeun tulisan kadua ngeunaan blockchain pikeun industri, anu munggaran .
Ngingetkeun patarosan pamiarsa kuring ngeunaan tulisan sateuacana dina séri ieu, éta kedah diperhatoskeun: LevelDB dianggo pikeun nyimpen data blockchain dina hal ieu, tapi teu aya anu ngahalangan anjeun tina ngagunakeun pangkalan data anu sanés, sapertos MySQL. Ayeuna hayu urang tingali struktur data ieu.
Hayu urang mimitian ku transaksi:
Ieu struktur datana:
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 nyimpen tipe data (pikeun transaksi 2), Hash urus, tipe transaksi sorangan, timestamp, kitu ogé inputs na outputs. Input TxIn nyimpen hash tina kaluaran transaksi anu dirujuk, nomer kaluaran, sareng bytecode, sedengkeun kaluaran TxOut nyimpen nilai sareng ogé bytecode.
Ayeuna hayu urang tingali tindakan naon anu tiasa dilakukeun ku transaksi dina datana, nyaéta, hayu urang nganalisis metode.
Pikeun nyieun transaksi, paké fungsi transaction.NewTransaction(txtype byte) *TX.
Metode AddTxIn(thattxhash[]byte, txoutn int, code[]byte)(*TxIn, error) nambihan input kana transaksi.
Metode AddTxOut(nilai int, data [] bait) (*TxOut, kasalahan) nambihan kaluaran kana transaksi.
The ToBytes () [] métode bait robah urus kana keureutan bait.
Fungsi internal preByteHash (bait [] bait) string dipaké dina Build () jeung Cék () pikeun nyieun Hash transaksi dihasilkeun cocog sareng hashes urus dihasilkeun tina aplikasi JavaScript.
Metoda Bangun () susunan Hash urus kieu: tx.TxHash = preByteHash (tx.ToBytes ()).
Metoda string ToJSON () ngarobah transaksi kana string JSON.
Metode kasalahan FromJSON(data [] bait) ngamuat transaksi tina format JSON anu disalurkeun salaku potongan bait.
Metodeu bool Cék () ngabandingkeun hasil hash tina widang Hash transaksi sareng hash anu diala ku hashing transaksi ieu (teu kalebet widang Hash).
Transaksi ditambahkeun kana blok:
Struktur data blok langkung seueur:
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 nyimpen jinis data, anu dianggo ku titik pikeun ngabédakeun blok tina transaksi atanapi data sanés. Pikeun blok, nilai ieu 1.
BlockHeight nyimpen jangkungna blok.
Stempel waktos.
HeaderSize nyaéta ukuran blok dina bait.
PrevBlockHash mangrupikeun hash tina blok sateuacana, sareng SelfBlockHash mangrupikeun hash tina blok ayeuna.
TxsHash mangrupikeun hash transaksi anu dibagikeun.
MerkleRoot nyaéta akar tangkal Merkle.
Widang di handap ngandung konci umum panyipta blok, tanda tangan panyipta, versi blok, jumlah transaksi dina blok, sareng transaksina sorangan.
Hayu urang nempo métode na:
Pikeun nyieun blok a, make block.NewBlock () fungsi: NewBlock (prevBlockHash string, jangkungna int) * Blok, nu narima Hash tina blok saméméhna jeung jangkungna diatur pikeun blok dijieun dina blockchain nu. Jinis blok ogé dieusian tina jinis pakét konstan:
b.DataType = types.BLOCK_TYPE.Metodeu AddTx(tx *transaction.TX) nambihan transaksi ka blok.
Metoda Build () ngamuat nilai kana widang blok sareng ngahasilkeun sareng nyetél hash ayeuna.
ToBytesHeader () [] métode bait narjamahkeun lulugu blok (tanpa transaksi) kana keureutan bait.
Metodeu string ToJSON () ngarobah blok kana format JSON dina ngagambarkeun string data.
Metode kasalahan FromJSON(data [] bait) ngamuat data tina JSON kana struktur blok.
Metodeu Check () bool ngahasilkeun blok Hash sareng ngabandingkeunana sareng anu ditunjuk dina widang blok Hash.
Metodeu string GetTxsHash () mulihkeun total hash sadaya transaksi di blok.
Metodeu GetMerkleRoot () nyetél akar tangkal Merkle pikeun transaksi di blok.
Metodeu Sign(privk string) nandatanganan blok nganggo konci pribadi panyipta blok.
Metodeu SetHeight(jangkungna int) nyerat jangkungna blok kana widang struktur blok.
Metodeu GetHeight () int mulih jangkungna blok sakumaha dieusian dina widang pakait tina struktur blok.
Metodeu ToGOBBytes () [] bait ngodekeun blok dina format GOB sareng ngabalikeun deui kana potongan bait.
Metode kasalahan FromGOBBytes(data [] bait) nyerat data blok kana struktur blok tina potongan bait anu diformat ku GOB.
Metodeu string GetHash () mulihkeun hash tina blok anu dipasihkeun.
Metodeu string GetPrevHash () mulihkeun hash tina blok saméméhna.
Metodeu SetPublicKey(pubk string) nyerat konci umum panyipta blok kana blok.
Ku kituna, ngagunakeun métode obyék Blok, urang bisa kalayan gampang ngarobahna kana format pikeun pangiriman ngaliwatan jaringan tur nyimpen kana database LevelDB.
Fungsi pakét blockchain di handap ieu tanggung jawab pikeun nyimpen kana blockchain:
Jang ngalampahkeun ieu, blok kudu nerapkeun panganteur IBlock:
type IGOBBytes interface {
ToGOBBytes() []byte
FromGOBBytes(data []byte) error
}
type IBlock interface {
IGOBBytes
GetHash() string
GetPrevHash() string
GetHeight() int
Check() bool
}Sambungan database dijieun sakali nalika pakét ieu initialized dina init () fungsi:
db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).CloseDB () mangrupakeun wrapper pikeun db.Cloce () - mangka disebut sanggeus gawé bareng fungsi pakét pikeun nutup sambungan kana database.
Fungsi kasalahan SetTargetBlockHash (hash string) nyerat hash tina blok ayeuna kana pangkalan data kalayan konci anu ditunjuk ku konstanta BLOCK_HASH.
Fungsi GetTargetBlockHash () (string, kasalahan) mulihkeun hash tina blok ayeuna anu disimpen dina pangkalan data.
Fungsi kasalahan SetTargetBlockHeight(jangkungna int) nyerat nilai jangkungna blockchain kana pangkalan data pikeun titik kalayan konci anu ditangtukeun ku konstanta BLOCK_HEIGHT.
Fungsi GetTargetBlockHeight () (int, kasalahan) ngabalikeun jangkungna blockchain pikeun titik anu dipasihkeun, disimpen dina pangkalan data.
The CheckBlock(blok IBlock) fungsi bool mariksa blok pikeun correctness saméméh nambahkeun blok eta ka blockchain nu.
Fungsi kasalahan AddBlock(block IBlock) nambihan blok kana blockchain.
Fungsi pikeun nyandak sareng ningali blok aya dina file explore.go tina pakét blockchain:
GetBlockByHash (hash string) (* block.Block, kasalahan) fungsi nyieun hiji objek blok kosong, beban blok ti database nu Hash disalurkeun ka dinya, sarta mulih pointer ka dinya.
Nyiptakeun blok genesis dilakukeun ku fungsi kasalahan Genesis () tina file genesis.go tina pakét blockchain.
Artikel salajengna bakal ngabahas kumaha nyambungkeun klien ka titik ngagunakeun mékanisme WebSocket.
sumber: www.habr.com
