Kepiye carane nggawe blok lan transaksi ing blokir Go

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).

Kepiye carane nggawe blok lan transaksi ing blokir Go

Iki minangka artikel kapindho babagan blockchain kanggo industri, sing pisanan kene.

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: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

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: github.com/Rusldv/bcstartup/blob/master/block/builder.go

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: github.com/Rusldv/bcstartup/tree/master/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

Add a comment