Kumaha kuring mendesain blok sareng transaksi dina Go blockchain kuring

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

Kumaha kuring mendesain blok sareng transaksi dina Go blockchain kuring

Ieu artikel kadua ngeunaan blockchain pikeun industri, kahiji di dieu.

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

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

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

Tambahkeun komentar