Dina raraga pamustunganana mungkas nepi ka blockchain a teu ngan database a, urang kudu nambahan 3 elemen penting pikeun proyék urang:
- Pedaran ngeunaan struktur data blok jeung métode
- Pedaran struktur data jeung métode transaksi
- Fungsi Blockchain anu ngahemat blok dina pangkalan data sareng mendakanana ku hash atanapi jangkungna (atanapi anu sanés).
Ieu artikel kadua ngeunaan blockchain pikeun industri, kahiji
Nginget patarosan anu pamiarsa naroskeun ka kuring ngeunaan tulisan sateuacana dina séri ieu, éta kedah diperhatoskeun: dina hal ieu, pangkalan data LevelDB dianggo pikeun nyimpen data blockchain, tapi teu aya anu nyegah anjeun nganggo anu sanés, sebutkeun, 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 urus 2), nu Hash tina transaksi éta, jenis urus sorangan, timestamp a, sarta inputs na outputs. Input TxIn nyimpen hash tina transaksi anu kaluaranna dirujuk, jumlah kaluaran ieu sareng bytecode, sareng kaluaran TxOut nyimpen sababaraha nilai sareng ogé bytecode.
Ayeuna hayu urang tingali tindakan naon anu tiasa dilakukeun ku transaksi dina datana, nyaéta. Hayu urang nempo métode.
Pikeun nyieun transaksi, make transaction.NewTransaction(txtype byte) *fungsi TX.
Metode AddTxIn(thattxhash [] bait, txoutn int, kode [] bait) (* TxIn, kasalahan) nambihan input kana transaksi.
Metode AddTxOut(nilai int, data [] bait) (*TxOut, kasalahan) nambihan kaluaran kana transaksi.
The ToBytes () [] métode bait robah urus kana nyiksikan 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 saperti 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.
Métode bool Cék () ngabandingkeun hasil hash tina widang Hash urus jeung Hash diala salaku hasil tina hashing urus ieu (ignoring 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 tipe data, titik ngagunakeun eta sarta ngabedakeun blok ti transaksi atawa data lianna. 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 anu ayeuna.
TxsHash mangrupikeun hash umum tina transaksi.
MerkleRoot nyaéta akar tangkal Merkle.
Salajengna dina widang aya konci umum tina panyipta blok, tanda tangan panyipta, versi blok, jumlah transaksi dina blok, sareng transaksi ieu sorangan.
Hayu urang nempo métode na:
Pikeun nyieun blok a, make block.NewBlock () fungsi: NewBlock (prevBlockHash string, jangkungna int) * Blok, nu nyokot Hash tina blok saméméhna jeung jangkungna diatur pikeun blok dijieun dina blockchain nu. Jinis blok ogé diatur 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 ngarobah lulugu blok (tanpa transaksi) kana keureutan bait.
Metoda 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 () nangtukeun akar tangkal Merkle pikeun transaksi di blok.
Metodeu Sign(privk string) nandatanganan blok nganggo konci pribadi tina panyipta blok.
Metodeu SetHeight(jangkungna int) nyerat jangkungna blok kana kolom 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.
Metoda kasalahan FromGOBBytes(data [] bait) nyerat data blok kana struktur blok tina potongan bait anu diliwatan dina format 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 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 () - disebut sanggeus gawé bareng fungsi pakét pikeun nutup sambungan kana database.
The SetTargetBlockHash (hash string) fungsi kasalahan nulis hash tina blok ayeuna jeung konci dieusian ku konstanta BLOCK_HASH kana database.
Fungsi GetTargetBlockHash () (string, kasalahan) mulihkeun hash tina blok ayeuna anu disimpen dina pangkalan data.
Fungsi kasalahan SetTargetBlockHeight(jangkungna int) nyerat kana pangkalan data nilai jangkungna blockchain pikeun titik kalayan konci anu ditunjuk ku konstanta BLOCK_HEIGHT.
Fungsi GetTargetBlockHeight () (int, kasalahan) mulihkeun jangkungna blockchain pikeun titik nu tangtu, disimpen dina database.
The CheckBlock(blok IBlock) fungsi bool mariksa blok pikeun correctness saméméh nambahkeun blok ieu 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 obyék blok kosong, beban blok kana eta tina database, hash nu ieu dibikeun ka dinya, sarta mulih pointer ka dinya.
Nyiptakeun blok genesis dilaksanakeun ku fungsi kasalahan Genesis () tina file genesis.go tina pakét blockchain.
Artikel salajengna bakal ngobrol ngeunaan nyambungkeun klien ka titik ngagunakeun mékanisme WebSocket.
sumber: www.habr.com