Conas a dhear mé bloic agus idirbhearta i mo blockchain Go

Chun deireadh a chur le blockchain agus ní bunachar sonraí amháin, ní mór dúinn 3 ghné thábhachtacha a chur lenár dtionscadal:

  • Cur síos ar struchtúr agus ar mhodhanna na sonraí bloc
  • Cur síos ar struchtúr sonraí agus modhanna idirbhirt
  • Feidhmeanna Blockchain a shábháil bloic i mbunachar sonraí agus iad a aimsiú ann ag a n-hash nó airde (nó rud éigin eile).

Conas a dhear mé bloic agus idirbhearta i mo blockchain Go

Is é seo an dara alt faoi blockchain don tionscal, an chéad cheann anseo.

Ag cuimhneamh ar na ceisteanna a d'iarr léitheoirí orm faoin alt roimhe seo sa tsraith seo, ba chóir a thabhairt faoi deara: sa chás seo, úsáidtear bunachar sonraí LevelDB chun sonraí blockchain a stóráil, ach ní chuireann aon rud cosc ​​​​ort aon cheann eile a úsáid, abair, MySQL. Anois, déanaimis féachaint ar struchtúr na sonraí seo.

Tosaímid le hidirbhearta: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Seo é a struchtúr sonraí:

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
}

Stórálann TX an cineál sonraí (do idirbheart 2), hash an idirbhirt sin, cineál an idirbhirt féin, stampa ama, agus ionchuir agus aschuir. Stórálann ionchuir TxIn hash an idirbhirt a ndéantar tagairt dá aschur, uimhir an aschuir seo agus an seachchód, agus stórálann aschuir TxOut luach éigin agus freisin seachchód.

Anois féachaimis cad iad na gníomhartha is féidir le hidirbheart a dhéanamh ar a shonraí, i.e. Breathnaímid ar na modhanna.

Chun idirbheart a chruthú, úsáid an fheidhm idirbheartaíochta.NewTransaction(txtype byte) *TX.

Cuireann an modh AddTxIn(thattxhash []beart, txoutn int, code []byte) (*TxIn, error) ionchur leis an idirbheart.

Cuireann an modh AddTxOut (luach slánuimhir, sonraí []beart) (*TxOut, earráid) aschur leis an idirbheart.

Leis an modh ToBytes() []beart, déantar an t-idirbheart ina slisne beart.

Úsáidtear an teaghrán feidhm inmheánach preByteHash (bearta []beart) i Build() agus Check() chun an hash idirbheart ginte a dhéanamh comhoiriúnach le hashes idirbhirt a ghintear ó fheidhmchláir JavaScript.

Socraíonn an modh Build() hash an idirbhirt mar seo a leanas: tx.TxHash = preByteHash(tx.ToBytes()).

Tiontaíonn modh teaghrán ToJSON() idirbheart ina theaghrán JSON.

Leis an modh earráide FromJSON(sonraí []beart) lódálann sé idirbheart ón bhformáid JSON a ritheadh ​​mar bheart beart.

Déanann an modh bool Check() comparáid idir an hash mar thoradh ar réimse hash an idirbhirt agus an hash a fhaightear mar thoradh ar an idirbheart seo a hash (gan aird a thabhairt ar an réimse hash).

Cuirtear idirbhearta leis an mbloc: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Tá struchtúr na sonraí bloc níos toirtiúla:

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
}

Stórálann DataType an cineál sonraí, úsáideann an nód é agus idirdhealú a dhéanamh idir an bloc ó idirbheart nó sonraí eile. I gcás bloc is é an luach seo ná 1.

Stórálann BlockHeight airde an bhloic.
Stampa ama ama.
Is é HeaderSize an blocmhéid i mbearta.
Is é PrevBlockHash hash an bhloic roimhe seo, agus is é SelfBlockHash hash an bhloc reatha.
Is hash ginearálta na n-idirbheart é TxsHash.
Is é MerkleRoot fréamh an chrainn Merkle.

Thairis sin sna réimsí tá eochair phoiblí cruthaitheoir an bhloc, síniú an chruthaitheora, leagan an bhloc, líon na n-idirbheart sa bhloc, agus na hidirbhearta sin iad féin.

Breathnaímid ar a modhanna:
Chun bloc a chruthú, bain úsáid as an bhfeidhm block.NewBlock(): NewBlock(prevBlockHash teaghrán, int airde) *Bloc, a thógann hash an bhloc roimhe seo agus an airde atá socraithe don bhloc cruthaithe sa bhlocchain. Socraítear an cineál bloc freisin ón tairiseach pacáiste cineálacha:

b.DataType = types.BLOCK_TYPE.

Cuireann an modh AddTx(tx *transaction.TX) idirbheart le bloc.

Déanann an modh Build() luachanna a luchtú isteach i réimsí an bhloic agus gineann agus socraíonn sé a hash reatha.

Tiontaíonn an modh beart ToBytesHeader() [] an ceanntásc bloc (gan idirbhearta) ina slisne beart.

Tiontaíonn modh teaghrán ToJSON() an bloc go formáid JSON i léiriú teaghrán de na sonraí.

Déanann an modh earráide FromJSON(sonraí []beart) sonraí ó JSON a luchtú isteach i struchtúr bloc.

Gineann an modh seiceála () bool hash bloc agus cuireann sé i gcomparáid é leis an gceann atá sonraithe sa réimse bloc hash.

Tugann an modh teaghrán GetTxsHash() hash iomlán gach idirbheart sa bhloc ar ais.

Sonraíonn an modh GetMerkleRoot() fréamh an chrainn Merkle le haghaidh idirbhearta i mbloc.

Síníonn an modh Sign(privk string) bloc le heochair phríobháideach chruthaitheoir na mbloc.

Scríobhann an modh SetHeight (airde isteach) airde an bhloic go dtí an réimse blocstruchtúr.

Tugann an modh int GetHeight() ar ais airde an bhloic mar a shonraítear sa réimse comhfhreagrach den struchtúr bloc.

Déanann an modh ToGOBBytes() []beart bloc a ionchódú i bhformáid GOB agus é a sheoladh ar ais mar bheart.

Leis an modh earráide FromGOBBytes(sonraí []beart) scríobhann sé blocshonraí chuig an struchtúr bloc ón slisne beart pas i bhformáid GOB.

Filleann an modh teaghrán GetHash() hash an bhloic tugtha.

Filleann modh teaghrán GetPrevHash() hash an bhloic roimhe seo.

Scríobhann an modh SetPublicKey (teaghrán pubk) eochair phoiblí chruthaitheoir an bhloic chuig an mbloc.

Mar sin, ag baint úsáide as modhanna an oibiachta Bloc, is féidir linn é a thiontú go formáid go héasca le haghaidh tarchur thar an líonra agus a shábháil ar bhunachar sonraí LevelDB.

Tá feidhmeanna an phacáiste blockchain freagrach as sábháil don blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Chun seo a dhéanamh, ní mór don bhloc comhéadan IBlock a chur i bhfeidhm:

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

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

}

Cruthaítear an nasc bunachar sonraí uair amháin nuair a chuirtear tús leis an bpacáiste san fheidhm init():

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

Is fillteán é CloseDB() le haghaidh db.Cloce() - ar a dtugtar tar éis oibriú leis na feidhmeanna pacáiste chun an nasc leis an mbunachar sonraí a dhúnadh.

Scríobhann an fheidhm earráide SetTargetBlockHash (hash string) hash an bhloc reatha leis an eochair atá sonraithe ag an tairiseach BLOCK_HASH don bhunachar sonraí.

Tugann an fheidhm GetTargetBlockHash() (teaghrán, earráid) hash an bhloc reatha atá stóráilte sa bhunachar sonraí ar ais.

Scríobhann feidhm earráide SetTargetBlockHeight (airde slánuimhir) chuig an mbunachar sonraí luach airde an bhlocshlabhra don nód leis an eochair atá sonraithe ag an tairiseach BLOCK_HEIGHT.

Tugann an fheidhm GetTargetBlockHeight() (int, error) airde an bhlocchain ar ais do nód ar leith, atá stóráilte sa bhunachar sonraí.

Seiceálann an fheidhm bhólachta CheckBlock (bloc IBlock) bloc le haghaidh cirt sula gcuirtear an bloc seo leis an blockchain.

Cuireann an fheidhm earráide AddBlock (bloc IBlock) bloc leis an blockchain.

Tá na feidhmeanna chun bloic a aisghabháil agus a fheiceáil sa chomhad explorer.go den phacáiste blockchain:

Cruthaíonn an fheidhm GetBlockByHash (teaghrán hash) (*block.Block, error) réad bloc folamh, lódálann sé bloc isteach ón mbunachar sonraí, ar cuireadh an hash chuige, agus cuireann sé pointeoir ar ais chuige.

Is é feidhm earráide Genesis() ón gcomhad genesis.go den phacáiste blockchain a chruthaíonn bloc genesis.

Labhróidh an chéad alt eile faoi chliaint a nascadh le nód ag baint úsáide as meicníocht WebSocket.

Foinse: will.com

Add a comment