Supaya pungkasane rampung karo blockchain lan ora mung database, kita kudu nambah 3 unsur penting kanggo proyek kita:
- Deskripsi struktur data blok dan metode
- Deskripsi struktur data lan cara transaksi
- Fungsi Blockchain sing nyimpen pamblokiran ing database lan nemokake ing kono kanthi hash utawa dhuwur (utawa liya).
Iki minangka artikel kapindho babagan blockchain kanggo industri, sing pisanan
Ngelingi pitakonan sing maca babagan artikel sadurunge ing seri iki, kudu dicathet: ing kasus iki, database LevelDB digunakake kanggo nyimpen data pamblokiran, nanging ora ana sing ngalangi sampeyan nggunakake liyane, ucapake, MySQL. Saiki ayo ndeleng struktur data iki.
Ayo miwiti karo transaksi:
Iki minangka struktur data:
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 jinis data (kanggo transaksi 2), hash transaksi kasebut, jinis transaksi kasebut, stempel wektu, lan input lan output. Input TxIn nyimpen hash transaksi sing output kasebut dirujuk, nomer output lan bytecode iki, lan output TxOut nyimpen sawetara nilai lan uga bytecode.
Saiki ayo ndeleng tumindak apa sing bisa ditindakake transaksi ing data kasebut, yaiku. Ayo katon ing cara.
Kanggo nggawe transaksi, gunakake transaction.NewTransaction(txtype byte) *fungsi TX.
AddTxIn(thattxhash []byte, txoutn int, kode []byte) (*TxIn, error) cara nambah input kanggo transaksi.
AddTxOut(nilai int, data [] bait) (*TxOut, kesalahan) cara nambah output kanggo transaksi.
ToBytes () [] cara byte ngowahi transaksi dadi irisan bait.
Fungsi internal preByteHash (byte [] byte) string digunakake ing Build () lan Priksa () kanggo nggawe hash transaksi sing digawe kompatibel karo hash transaksi sing digawe saka aplikasi JavaScript.
Mbangun () cara nyetel hash transaksi minangka nderek: tx.TxHash = preByteHash (tx.ToBytes ()).
Metode string ToJSON() ngowahi transaksi dadi string JSON.
Metode kesalahan FromJSON(data [] byte) ngemot transaksi saka format JSON sing dilewati minangka irisan bait.
Cara bool Priksa () mbandhingake hash asil saka lapangan hash transaksi karo hash sing dipikolehi minangka asil hashing transaksi iki (nglirwakake lapangan hash).
Transaksi ditambahake menyang blok:
Struktur data blok luwih akeh:
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, simpul kasebut nggunakake lan mbedakake blok saka transaksi utawa data liyane. Kanggo blok nilai iki 1.
BlockHeight nyimpen dhuwure blok.
Stempel wektu.
HeaderSize minangka ukuran blok ing bita.
PrevBlockHash minangka hash saka blok sadurunge, lan SelfBlockHash minangka hash saka sing saiki.
TxsHash minangka hash umum transaksi.
MerkleRoot minangka oyod saka wit Merkle.
Luwih ing lapangan ana kunci umum saka pencipta blok, teken saka pencipta, versi blok, jumlah transaksi ing blok, lan transaksi kasebut dhewe.
Ayo ndeleng metode kasebut:
Kanggo nggawe pemblokiran, gunakake fungsi block.NewBlock(): NewBlock(prevBlockHash string, height int) *Block, sing njupuk hash saka blok sadurunge lan set dhuwur kanggo blok sing digawe ing blockchain. Jinis blok uga disetel saka konstanta paket jinis:
b.DataType = types.BLOCK_TYPE.
Cara AddTx(tx *transaction.TX) nambah transaksi menyang blok.
Metode Build () ngemot nilai menyang kolom blok lan ngasilake lan nyetel hash sing saiki.
ToBytesHeader() []cara byte ngowahi header blok (tanpa transaksi) dadi irisan bait.
Metode string ToJSON () ngowahi blok menyang format JSON ing representasi string data.
Metode kesalahan FromJSON(data [] byte) ngemot data saka JSON menyang struktur blok.
Cara bool Priksa () ngasilake hash blok lan mbandhingake karo sing kasebut ing kolom hash blok.
Metode string GetTxsHash() ngasilake hash total kabeh transaksi ing blok kasebut.
Metode GetMerkleRoot () nemtokake oyod wit Merkle kanggo transaksi ing blok.
Metode Tandha (privk string) menehi tandha pemblokiran kanthi kunci pribadi saka panyipta blok.
Metode SetHeight(height int) nulis dhuwur blok menyang kolom struktur blok.
Metode int GetHeight () ngasilake dhuwur blok kaya sing kasebut ing kolom struktur blok sing cocog.
Cara ToGOBBytes () [] bait ngodhe blok ing format GOB lan ngasilake minangka irisan bait.
Cara kesalahan FromGOBBytes(data [] byte) nulis data pemblokiran menyang struktur pemblokiran saka irisan byte sing dilewati ing format GOB.
Metode string GetHash () ngasilake hash saka blok sing diwenehake.
Metode string GetPrevHash () ngasilake hash saka blok sadurunge.
Metode SetPublicKey(pubk string) nulis kunci umum panyipta blok menyang blok kasebut.
Mangkono, nggunakake cara saka obyek Blok, kita bisa gampang Ngonversi menyang format kanggo transmisi liwat jaringan lan nyimpen kanggo database LevelDB.
Fungsi paket blockchain tanggung jawab kanggo nyimpen menyang blockchain:
Kanggo nindakake iki, blok kasebut kudu ngetrapake antarmuka IBlock:
type IGOBBytes interface {
ToGOBBytes() []byte
FromGOBBytes(data []byte) error
}
type IBlock interface {
IGOBBytes
GetHash() string
GetPrevHash() string
GetHeight() int
Check() bool
}
Sambungan database digawe sapisan nalika paket diwiwiti ing fungsi init ():
db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).
CloseDB () iku pambungkus kanggo db.Cloce () - disebut sawise nggarap fungsi paket kanggo nutup sambungan kanggo database.
Fungsi kesalahan SetTargetBlockHash(senar hash) nulis hash saka blok saiki kanthi kunci sing ditemtokake dening konstanta BLOCK_HASH menyang database.
Fungsi GetTargetBlockHash () (string, kesalahan) ngasilake hash saka blok saiki sing disimpen ing database.
Fungsi kesalahan SetTargetBlockHeight(height int) nulis ing basis data nilai dhuwure pamblokiran kanggo simpul kanthi kunci sing ditemtokake dening konstanta BLOCK_HEIGHT.
Fungsi GetTargetBlockHeight () (int, kesalahan) ngasilake dhuwur pamblokiran kanggo simpul tartamtu, disimpen ing database.
Fungsi CheckBlock(blok IBlock) bool mriksa pamblokiran kanggo bener sadurunge nambah blok iki kanggo blockchain.
Fungsi kesalahan AddBlock(block IBlock) nambahake blok menyang pamblokiran.
Fungsi kanggo njupuk lan ndeleng blok ana ing file explore.go paket blockchain:
Fungsi GetBlockByHash(senar hash) (* block.Block, kesalahan) nggawe obyek blok kosong, ngemot blok saka database, hash sing diterusake, lan ngasilake pointer.
Nggawe pemblokiran genesis ditindakake dening fungsi kesalahan Genesis () saka file genesis.go saka paket blockchain.
Artikel sabanjure bakal ngomong babagan nyambungake klien menyang simpul nggunakake mekanisme WebSocket.
Source: www.habr.com