Bii MO ṣe ṣe apẹrẹ awọn bulọọki ati awọn iṣowo ni Go blockchain mi

Lati le pari nikẹhin pẹlu blockchain kii ṣe aaye data nikan, a nilo lati ṣafikun awọn eroja pataki mẹta si iṣẹ akanṣe wa:

  • Apejuwe ti awọn Àkọsílẹ data be ati awọn ọna
  • Apejuwe ti data be ati idunadura awọn ọna
  • Awọn iṣẹ Blockchain ti o fipamọ awọn bulọọki sinu aaye data kan ati rii wọn nibẹ nipasẹ hash tabi giga wọn (tabi nkan miiran).

Bii MO ṣe ṣe apẹrẹ awọn bulọọki ati awọn iṣowo ni Go blockchain mi

Eyi ni nkan keji nipa blockchain fun ile-iṣẹ, akọkọ nibi.

Ranti awọn ibeere ti awọn onkawe beere lọwọ mi nipa nkan ti tẹlẹ ninu jara yii, o yẹ ki o ṣe akiyesi: ninu ọran yii, data LevelDB ni a lo lati tọju data blockchain, ṣugbọn ko si ohun ti o ṣe idiwọ fun ọ lati lo eyikeyi miiran, sọ, MySQL. Bayi jẹ ki ká wo ni awọn be ti yi data.

Jẹ ki a bẹrẹ pẹlu awọn iṣowo: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

Eyi ni eto data rẹ:

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 tọju iru data naa (fun idunadura 2), hash ti idunadura yẹn, iru idunadura naa funrararẹ, aami akoko kan, ati awọn igbewọle ati awọn igbejade. Awọn igbewọle TxIn tọju hash ti idunadura ti iṣelọpọ rẹ jẹ itọkasi, nọmba iṣelọpọ yii ati bytecode, ati awọn abajade TxOut tọju iye diẹ ati paapaa bytecode.

Bayi jẹ ki a wo awọn iṣe ti iṣowo le ṣe lori data rẹ, ie. Jẹ ká wo ni awọn ọna.

Lati ṣẹda idunadura, lo idunadura.NewTransaction(txtype baiti) *TX iṣẹ.

Ọna AddTxIn (thattxhash [] byte, txoutn int, koodu [] baiti) (*TxIn, aṣiṣe) ọna ṣe afikun ohun kikọ sii si idunadura naa.

Ọna AddTxOut (iye int, data [] baiti) (* TxOut, aṣiṣe) ọna ṣe afikun abajade si idunadura naa.

Ọna ToBytes () [] baiti yi idunadura naa pada si bibẹ baiti kan.

Okun inu iṣẹ inu preByteHash (baiti [] baiti) ni a lo ni Kọ () ati Ṣayẹwo () lati jẹ ki hash idunadura ti ipilẹṣẹ ni ibamu pẹlu awọn hashes idunadura ti ipilẹṣẹ lati awọn ohun elo JavaScript.

Ọna Kọ () ṣeto hash idunadura bi atẹle: tx.TxHash = preByteHash(tx.ToBytes()).

Ọna okun ToJSON() ṣe iyipada idunadura kan sinu okun JSON kan.

Ọna aṣiṣe FromJSON(data []byte) n gbe owo idunadura kan lati ọna kika JSON ti o kọja bi bibẹ baiti kan.

Ọna ayẹwo () bool ṣe afiwe hash ti o yọrisi lati aaye hash idunadura pẹlu hash ti o gba bi abajade ti hashing idunadura yii (ni aibikita aaye hash).

Awọn iṣowo ti wa ni afikun si bulọki: github.com/Rusldv/bcstartup/blob/master/block/builder.go

Eto data Àkọsílẹ jẹ iwọn didun diẹ sii:

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 tọjú iru data, ipade naa nlo ati ṣe iyatọ idinamọ lati idunadura tabi data miiran. Fun idina kan iye yii jẹ 1.

BlockHeight tọju giga ti bulọọki naa.
Timestamp timestamp.
Iwọn akọsori jẹ iwọn bulọki ni awọn baiti.
PrevBlockHash jẹ hash ti bulọọki iṣaaju, ati SelfBlockHash jẹ hash ti lọwọlọwọ.
TxsHash jẹ hash gbogbogbo ti awọn iṣowo.
MerkleRoot jẹ gbongbo igi Merkle.

Siwaju sii ni awọn aaye nibẹ ni bọtini gbangba ti Eleda ti bulọọki, ibuwọlu ti olupilẹṣẹ, ẹya ti bulọọki, nọmba awọn iṣowo ninu bulọki, ati awọn iṣowo wọnyi funrararẹ.

Jẹ ki a wo awọn ọna rẹ:
Lati ṣẹda Àkọsílẹ, lo block.NewBlock() iṣẹ: NewBlock(okun prevBlockHash, iga int) *Block, eyi ti o gba hash ti išaaju Àkọsílẹ ati giga ṣeto fun awọn ti ṣẹda Àkọsílẹ ninu blockchain. Iru bulọọki tun ṣeto lati awọn iru idii igbagbogbo:

b.DataType = types.BLOCK_TYPE.

Ọna AddTx (tx *transaction.TX) ṣe afikun idunadura kan si bulọọki kan.

Ọna Kọ () gbe awọn iye sinu awọn aaye bulọọki ati ipilẹṣẹ ati ṣeto hash lọwọlọwọ rẹ.

Ọna ToBytesHeader () [] ọna baiti ṣe iyipada akọsori Àkọsílẹ (laisi awọn iṣowo) sinu bibẹ baiti kan.

Ọna okun ToJSON() ṣe iyipada bulọki si ọna kika JSON ni aṣoju okun ti data naa.

Ọna aṣiṣe FromJSON(data []byte) n gbe data lati JSON sinu eto idina kan.

Ọna Ṣayẹwo () bool ṣe ipilẹṣẹ hash Àkọsílẹ ati ki o ṣe afiwe rẹ pẹlu eyi ti a pato ninu aaye hash Àkọsílẹ.

Ọna okun GetTxsHash() n da hash lapapọ ti gbogbo awọn iṣowo ninu bulọki pada.

Awọn ọna GetMerkleRoot () pato awọn root ti awọn Merkle igi fun lẹkọ ni a Àkọsílẹ.

Ọna Sign(okun ikọkọ) ṣe ami bulọki pẹlu bọtini ikọkọ ti ẹlẹda Àkọsílẹ.

Ọna SetHeight(giga int) kọwe giga ti bulọọki si aaye eto idina.

Ọna GetHeight () int n da giga ti bulọọki pada gẹgẹbi pato ninu aaye ti o baamu ti eto idina.

Ọna ToGOBBytes () [] ọna baiti ṣe koodu idinaki ni ọna kika GOB ki o da pada bi ege baiti kan.

Ọna aṣiṣe FromGOBBytes(data [] bayte) kọ data dina si ọna idina lati bibẹ baiti ti o kọja ni ọna kika GOB.

Ọna okun GetHash () da hash ti bulọọki ti a fun pada.

Ọna okun GetPrevHash() da hash ti bulọọki iṣaaju pada.

Ọna SetPublicKey(okun pubk) kọ bọtini gbogbo eniyan ti olupilẹṣẹ idina si bulọki naa.

Bayi, lilo awọn ọna ti ohun Àkọsílẹ, a le ni rọọrun yipada si ọna kika fun gbigbe lori nẹtiwọki ati fifipamọ si aaye data LevelDB.

Awọn iṣẹ ti package blockchain jẹ iduro fun fifipamọ si blockchain: github.com/Rusldv/bcstartup/tree/master/blockchain

Lati ṣe eyi, bulọki naa gbọdọ ṣe imuse wiwo IBlock:

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

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

}

Asopọ data jẹ ṣẹda lẹẹkan nigbati package ti wa ni ibẹrẹ ni iṣẹ init():

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

CloseDB () ni a wrapper fun db.Cloce () - ti a npe ni lẹhin ti ṣiṣẹ pẹlu awọn package awọn iṣẹ lati pa awọn asopọ si awọn database.

Iṣẹ aṣiṣe SetTargetBlockHash(okun hash) kọ hash ti bulọọki lọwọlọwọ pẹlu bọtini ti a ṣalaye nipasẹ igbagbogbo BLOCK_HASH si ibi ipamọ data.

Iṣẹ GetTargetBlockHash () (okun, aṣiṣe) da hash ti bulọọki lọwọlọwọ ti o fipamọ sinu aaye data pada.

Iṣẹ aṣiṣe SetTargetBlockHeight(giga int) kọwe si ibi ipamọ data iye ti giga blockchain fun ipade pẹlu bọtini ti a ṣalaye nipasẹ igbagbogbo BLOCK_HEIGHT.

Awọn iṣẹ GetTargetBlockHeight () (int, aṣiṣe) da awọn iga ti blockchain pada fun a fi fun ipade, ti o ti fipamọ ni awọn database.

Iṣẹ CheckBlock(Block IBlock) iṣẹ bool ṣayẹwo bulọọki kan fun titọ ṣaaju ki o to ṣafikun bulọọki yii si blockchain.

Iṣẹ aṣiṣe AddBlock (idinamọ IBlock) ṣe afikun idina kan si blockchain.

Awọn iṣẹ fun gbigba pada ati wiwo awọn bulọọki wa ninu faili explore.go ti package blockchain:

Iṣẹ GetBlockByHash (okun hash) (* block.Block, asise) ṣẹda ohun idina kan ti o ṣofo, o gbe bulọki kan sinu rẹ lati ibi ipamọ data, hash eyiti o ti kọja si, o si da itọka kan pada si.

Ṣiṣẹda bulọọki genesis jẹ ṣiṣe nipasẹ iṣẹ aṣiṣe Genesisi () lati faili genesis.go ti package blockchain.

Nkan ti o tẹle yoo sọrọ nipa sisopọ awọn alabara si ipade kan nipa lilo ẹrọ WebSocket.

orisun: www.habr.com

Fi ọrọìwòye kun