Yadda na tsara tubalan da ma'amaloli a cikin Go blockchain na

Domin a ƙarshe ƙare tare da blockchain ba kawai bayanan bayanai ba, muna buƙatar ƙara abubuwa masu mahimmanci 3 zuwa aikinmu:

  • Bayanin tsarin toshe bayanai da hanyoyin
  • Bayanin tsarin bayanai da hanyoyin ma'amala
  • Ayyukan Blockchain waɗanda ke adana tubalan a cikin bayanan bayanai kuma su same su a can ta zanta ko tsayi (ko wani abu dabam).

Yadda na tsara tubalan da ma'amaloli a cikin Go blockchain na

Wannan shine labarin na biyu game da blockchain don masana'antu, na farko a nan.

Tunawa da tambayoyin da masu karatu suka yi mini game da labarin da ya gabata a cikin wannan jerin, ya kamata a lura: a wannan yanayin, ana amfani da bayanan LevelDB don adana bayanan blockchain, amma babu abin da zai hana ku amfani da wani, a ce, MySQL. Yanzu bari mu dubi tsarin wannan bayanan.

Bari mu fara da ma'amaloli: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Ga tsarin bayanansa:

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 yana adana nau'in bayanai (na ma'amala 2), zanta na waccan ma'amala, nau'in ciniki da kanta, tambarin lokaci, da bayanai da fitarwa. Abubuwan shigar da TxIn suna adana hash na ma'amala wanda aka yi nuni da abin da aka fitar, adadin wannan fitarwa da bytecode, da abubuwan TxOut suna adana wasu ƙima da kuma bytecode.

Yanzu bari mu ga irin ayyukan da ma'amala za ta iya yi akan bayananta, watau. Bari mu dubi hanyoyin.

Don ƙirƙirar ma'amala, yi amfani da ma'amala.NewTransaction(txtype byte) *Aikin TX.

Hanyar AddTxIn (thatxhash [] byte, txoutn int, lambar [] byte) (*TxIn, kuskure) hanya tana ƙara shigarwa zuwa ma'amala.

Hanyar AddTxOut (darajar int, bayanai [] byte) (*TxOut, kuskure) yana ƙara fitarwa zuwa ma'amala.

Hanyar ToBytes() []byte tana juya ciniki zuwa yanki na byte.

Ana amfani da kirtani na cikin gida preByteHash(bytes []byte) a Gina () da Duba() don sanya hash ɗin da aka samar ya dace da hashes na ma'amala da aka samar daga aikace-aikacen JavaScript.

Hanyar Build() tana saita hash ɗin ciniki kamar haka: tx.TxHash = preByteHash(tx.ToBytes()).

Hanyar igiyar ToJSON() tana canza ma'amala zuwa igiyar JSON.

Hanyar Kuskuren FromJSON(bayanai []byte) yana ɗaukar ma'amala daga tsarin JSON da aka wuce azaman yanki na byte.

Hanyar Check() bool tana kwatanta zantan da aka samu daga filin hash ɗin ciniki da hash ɗin da aka samu a sakamakon hash ɗin wannan ma'amala (ba kula da filin hash).

Ana ƙara ma'amaloli zuwa toshe: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Tsarin bayanan toshe ya fi girma:

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 yana adana nau'in bayanan, kumburi yana amfani da shi kuma yana bambanta toshe daga ma'amala ko wasu bayanai. Don toshe wannan ƙimar ita ce 1.

BlockHeight yana adana tsayin toshe.
Tambarin lokaci.
HeaderSize shine girman toshe a cikin bytes.
PrevBlockHash shine zanta na toshe na baya, kuma SelfBlockHash shine zaton na yanzu.
TxsHash babban hash ne na ma'amaloli.
MerkleRoot shine tushen bishiyar Merkle.

Bugu da ari a cikin filayen akwai maɓalli na jama'a na mahaliccin toshe, sa hannun mahaliccin, nau'in toshe, adadin ma'amala a cikin toshe, da waɗannan ma'amala da kansu.

Mu duba hanyoyinsa:
Don ƙirƙirar toshe, yi amfani da block.NewBlock() aiki: NewBlock(prevBlockHash string, height int) *Block, wanda ke ɗaukar hash na tubalan da ya gabata da tsayin da aka saita don toshe ƙirƙira a cikin blockchain. Hakanan an saita nau'in toshe daga nau'ikan fakitin dindindin:

b.DataType = types.BLOCK_TYPE.

Hanyar AddTx(tx *transaction.TX) tana ƙara ma'amala zuwa toshe.

Hanyar Build() tana ɗaukar ƙima a cikin filayen toshe kuma tana ƙirƙira da saita zanta na yanzu.

Hanyar ToBytesHeader() []byte tana juyar da kan toshe (ba tare da ciniki ba) zuwa yanki na byte.

Hanyar igiyar ToJSON() tana juyar da toshe zuwa tsarin JSON a cikin wakilcin kirtani na bayanai.

Hanyar Kuskuren FromJSON(data []byte) yana loda bayanai daga JSON zuwa tsarin toshewa.

Hanyar Check() bool tana haifar da toshe hash kuma tana kwatanta shi da wanda aka kayyade a cikin toshe hash.

Hanyar layin GetTxsHash() tana mayar da jimlar zanta na duk ma'amaloli a cikin toshe.

Hanyar GetMerkleRoot() ta fayyace tushen bishiyar Merkle don mu'amala a cikin toshe.

Hanyar Sign(privk string) tana sanya alamar toshe tare da maɓallin keɓaɓɓen mahaliccin toshe.

Hanyar SetHeight(tsawo int) tana rubuta tsayin toshe zuwa filin tsarin toshe.

Hanyar GetHeight() int tana mayar da tsayin toshe kamar yadda aka ƙayyade a cikin daidai filin tsarin toshe.

Hanyar ToGOBBytes() []byte tana ɓoye toshe a tsarin GOB kuma tana mayar da shi azaman yanki na byte.

Hanyar Kuskuren FromGOBBytes(data []byte) tana rubuta toshe bayanai zuwa tsarin toshewa daga yanki na byte da aka wuce a tsarin GOB.

Hanyar kirtani GetHash() tana mayar da zanta na toshewar da aka bayar.

Hanyar kirtani GetPrevHash() tana mayar da zanta na toshewar da ta gabata.

Hanyar SetPublicKey(string pubk) tana rubuta maɓallin jama'a na mahaliccin toshe zuwa toshe.

Don haka, ta yin amfani da hanyoyin Block abu, cikin sauƙi za mu iya canza shi zuwa tsari don watsawa akan hanyar sadarwa da adanawa zuwa bayanan LevelDB.

Ayyukan fakitin blockchain suna da alhakin adanawa zuwa blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Don yin wannan, toshe dole ne aiwatar da IBlock dubawa:

type IGOBBytes interface {
	ToGOBBytes() []byte
	FromGOBBytes(data []byte) error
}

type IBlock interface {
	IGOBBytes
	GetHash() string
	GetPrevHash() string
	GetHeight() int
	Check() bool

}

Ana ƙirƙira haɗin bayanan sau ɗaya lokacin da aka fara kunshin a cikin aikin init():

db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).

CloseDB() nannade ne don db.Cloce() - wanda ake kira bayan aiki tare da ayyukan fakitin don rufe haɗin kai zuwa bayanan bayanai.

Kuskuren SetTargetBlockHash(string hash) yana rubuta zanta na toshe na yanzu tare da maɓallin da BLOCK_HASH akai-akai ya kayyade zuwa bayanan bayanai.

Aikin GetTargetBlockHash() (kirtani, kuskure) yana dawo da zanta na toshe na yanzu da aka adana a cikin bayanan.

Ayyukan kuskuren SetTargetBlockHeight(tsawo int) yana rubuta wa ma'ajin bayanai ƙimar tsayin blockchain don kumburi tare da maɓalli da aka ƙayyade ta akai-akai ta BLOCK_HEIGHT.

Aikin GetTargetBlockHeight() (int, error) yana dawo da tsayin blockchain don kumburin da aka bayar, wanda aka adana a cikin bayanan.

Aikin CheckBlock (block IBlock) bool yana bincika toshe don daidaito kafin ƙara wannan toshe zuwa blockchain.

Kuskuren addBlock (block IBlock) yana ƙara toshe toshe.

Ayyukan maidowa da duba tubalan suna cikin fayil explore.go na fakitin toshe:

Aikin GetBlockByHash(zatar hash) (*block.Block, error) yana haifar da wani abu toshe fanko, ya loda wani block a cikinsa daga ma'ajin bayanai, zaton wanda aka mika masa, sannan ya mayar masa da mai nuni.

Ƙirƙirar toshewar genesis ana aiwatar da shi ta aikin kuskuren Genesis() daga fayil ɗin genesis.go na kunshin blockchain.

Labari na gaba zai yi magana game da haɗa abokan ciniki zuwa kumburi ta amfani da hanyar WebSocket.

source: www.habr.com

Add a comment