منهنجي Go blockchain ۾ ڪيئن مون بلاڪ ۽ ٽرانزيڪشن کي ڊزائين ڪيو

آخرڪار بلاڪچين سان ختم ڪرڻ لاءِ ۽ نه صرف هڪ ڊيٽابيس، اسان کي اسان جي منصوبي ۾ 3 اهم عنصر شامل ڪرڻ جي ضرورت آهي:

  • بلاڪ ڊيٽا جي جوڙجڪ ۽ طريقن جي وضاحت
  • ڊيٽا جي جوڙجڪ ۽ ٽرانزيڪشن طريقن جي وضاحت
  • Blockchain افعال جيڪي ڊيٽابيس ۾ بلاڪ کي محفوظ ڪن ٿا ۽ انهن کي انهن جي هش يا اونچائي (يا ٻيو ڪجهه) ذريعي ڳوليندا آهن.

منهنجي Go blockchain ۾ ڪيئن مون بلاڪ ۽ ٽرانزيڪشن کي ڊزائين ڪيو

هي صنعت لاء بلاڪچين بابت ٻيو مضمون آهي، پهريون هتي.

انهن سوالن کي ياد ڪندي جيڪي پڙهندڙن مون کان هن سلسلي ۾ پوئين مضمون بابت پڇيا، اهو نوٽ ڪيو وڃي: هن صورت ۾، ليول ڊي بي ڊيٽابيس بلاڪچين ڊيٽا کي ذخيرو ڪرڻ لاء استعمال ڪيو ويندو آهي، پر ڪجھ به توهان کي ڪنهن ٻئي کي استعمال ڪرڻ کان روڪيو، چئو، MySQL. هاڻي اچو ته هن ڊيٽا جي جوڙجڪ تي نظر.

اچو ته ٽرانزيڪشن سان شروع ڪريون: github.com/Rusldv/bcstartup/blob/master/transaction/builder.go

هتي ان جي ڊيٽا جي جوڙجڪ آهي:

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 ڊيٽا جي قسم کي ذخيرو ڪري ٿو (ٽرانزيڪشن 2 لاءِ)، ان ٽرانزيڪشن جو هيش، پاڻ ٽرانزيڪشن جو قسم، ٽائم اسٽيمپ، ۽ ان پٽ ۽ آئوٽ. TxIn انپٽس ٽرانزيڪشن جي هيش کي اسٽور ڪن ٿا جن جي آئوٽ جو حوالو ڏنو ويو آهي، هن آئوٽ جو تعداد ۽ بائيٽ ڪوڊ، ۽ TxOut آئوٽ پُٽ ڪجهه قدر ۽ بائيٽ ڪوڊ پڻ محفوظ ڪن ٿا.

هاڻي اچو ته ڏسون ته هڪ ٽرانزيڪشن پنهنجي ڊيٽا تي ڪهڙيون ڪارروايون ڪري سگهي ٿي، يعني. اچو ته طريقن کي ڏسو.

ٽرانزيڪشن ٺاهڻ لاءِ، ٽرانزيڪشن استعمال ڪريو.NewTransaction(txtype byte) *TX فنڪشن.

AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn، error) طريقو ٽرانزيڪشن ۾ ان پٽ شامل ڪري ٿو.

AddTxOut(value int، data []byte) (*TxOut، error) طريقو ٽرانزيڪشن ۾ هڪ آئوٽ شامل ڪري ٿو.

ToBytes() []byte طريقو ٽرانزيڪشن کي بائيٽ سلائس ۾ تبديل ڪري ٿو.

اندروني فنڪشن preByteHash(bytes []byte) اسٽرنگ استعمال ڪيو ويندو آهي Build() ۽ Check() ۾ ٺاهيل ٽرانزيڪشن هيش کي ٺاهڻ لاءِ جاوا اسڪرپٽ ايپليڪيشنن مان ٺاهيل ٽرانزيڪشن هيش سان.

Build() طريقو ٽرانزيڪشن هيش هن ريت ترتيب ڏئي ٿو: tx.TxHash = preByteHash(tx.ToBytes()).

ToJSON() اسٽرنگ جو طريقو ٽرانزيڪشن کي JSON اسٽرنگ ۾ بدلائي ٿو.

FromJSON(data []byte) غلطي جو طريقو JSON فارميٽ مان ٽرانزيڪشن لوڊ ڪري ٿو جيڪو بائيٽ سلائس طور منظور ڪيو ويو آھي.

Check() bool طريقو ٽرانزيڪشن هيش فيلڊ مان نتيجو هيش جو مقابلو ڪري ٿو هن ٽرانزيڪشن کي هٽائڻ جي نتيجي ۾ حاصل ڪيل هيش سان (هيش فيلڊ کي نظر انداز ڪندي).

ٽرانزيڪشن بلاڪ ۾ شامل ڪيا ويا آهن: github.com/Rusldv/bcstartup/blob/master/block/builder.go

بلاڪ ڊيٽا جي جوڙجڪ وڌيڪ وڏي آهي:

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 ڊيٽا جي قسم کي ذخيرو ڪري ٿو، نوڊ ان کي استعمال ڪري ٿو ۽ بلاڪ کي ٽرانزيڪشن يا ٻي ڊيٽا کان ڌار ڪري ٿو. هڪ بلاڪ لاء هي قدر 1 آهي.

BlockHeight بلاڪ جي اوچائي کي محفوظ ڪري ٿو.
ٽائم اسٽيمپ ٽائيم اسٽيمپ.
HeaderSize بائيٽ ۾ بلاڪ سائيز آهي.
PrevBlockHash اڳوڻي بلاڪ جو هيش آهي، ۽ SelfBlockHash موجوده هڪ جو هيش آهي.
TxsHash ٽرانزيڪشن جو هڪ عام هيش آهي.
MerkleRoot Merkle وڻ جي پاڙ آهي.

وڌيڪ شعبن ۾ بلاڪ جي خالق جي عوامي چيڪ، تخليق ڪندڙ جي دستخط، بلاڪ جو نسخو، بلاڪ ۾ ٽرانزيڪشن جو تعداد، ۽ اھي ٽرانزيڪشن پاڻ آھن.

اچو ته ان جا طريقا ڏسو:
بلاڪ ٺاھڻ لاءِ، استعمال ڪريو block.NewBlock() فنڪشن: NewBlock(prevBlockHash string, height int) *Block، جيڪو پوئين بلاڪ جو ھيش وٺندو آھي ۽ blockchain ۾ ٺاھيل بلاڪ لاءِ اوچائي سيٽ ڪندو آھي. بلاڪ جو قسم پڻ سيٽ ڪيو ويو آھي قسمن جي پيڪيج کان مسلسل:

b.DataType = types.BLOCK_TYPE.

AddTx(tx *transaction.TX) طريقو هڪ ٽرانزيڪشن کي بلاڪ ۾ شامل ڪري ٿو.

Build() طريقو قدرن کي بلاڪ جي فيلڊ ۾ لوڊ ڪري ٿو ۽ ان جي موجوده هيش کي ٺاهي ۽ سيٽ ڪري ٿو.

ToBytesHeader() []byte طريقو بلاڪ هيڊر (بغير ٽرانزيڪشن) کي بائيٽ سلائس ۾ بدلائي ٿو.

ToJSON() اسٽرنگ طريقو بلاڪ کي JSON فارميٽ ۾ ڊيٽا جي اسٽرنگ نمائندگي ۾ بدلائي ٿو.

FromJSON(data []byte) غلطي جو طريقو JSON کان ڊيٽا کي بلاڪ ڍانچي ۾ لوڊ ڪري ٿو.

Check() bool طريقو هڪ بلاڪ هيش ٺاهي ٿو ۽ ان کي بلاڪ هيش فيلڊ ۾ بيان ڪيل هڪ سان مقابلو ڪري ٿو.

GetTxsHash() اسٽرنگ جو طريقو بلاڪ ۾ سڀني ٽرانزيڪشن جي ڪل هش کي واپس ڏئي ٿو.

GetMerkleRoot() طريقو وضاحت ڪري ٿو Merkle وڻ جي روٽ کي بلاڪ ۾ ٽرانزيڪشن لاءِ.

نشاني (privk string) طريقو بلاڪ ٺاھيندڙ جي پرائيويٽ ڪنجي سان بلاڪ کي نشانو بڻائيندو آھي.

SetHeight (height int) طريقو بلاڪ جي اوچائي کي بلاڪ جي جوڙجڪ جي فيلڊ ۾ لکي ٿو.

GetHeight() int طريقو بلاڪ جي اونچائي کي واپس ڏئي ٿو جيئن بلاڪ جي جوڙجڪ جي لاڳاپيل فيلڊ ۾ بيان ڪيل آهي.

ToGOBBytes() []byte طريقو GOB فارميٽ ۾ بلاڪ کي انڪوڊ ڪري ٿو ۽ ان کي بائيٽ سلائس طور واپس ڪري ٿو.

FromGOBBytes(data []byte) غلطي جو طريقو GOB فارميٽ ۾ پاس ٿيل بائيٽ سلائس مان بلاڪ ڍانچي کي بلاڪ ڊيٽا لکي ٿو.

GetHash() اسٽرنگ جو طريقو ڏنل بلاڪ جي هيش کي واپس ڏئي ٿو.

GetPrevHash() اسٽرنگ جو طريقو پوئين بلاڪ جي هيش کي موٽائي ٿو.

SetPublicKey (pubk string) طريقو بلاڪ ٺاهيندڙ جي عوامي ڪنجي کي بلاڪ ڏانهن لکي ٿو.

اهڙيء طرح، بلاڪ اعتراض جي طريقن کي استعمال ڪندي، اسان ان کي آساني سان نيٽ ورڪ تي ٽرانسميشن جي فارميٽ ۾ تبديل ڪري سگھون ٿا ۽ LevelDB ڊيٽابيس ۾ محفوظ ڪري سگھون ٿا.

بلاڪچين پيڪيج جا ڪم بلاڪچين کي محفوظ ڪرڻ جا ذميوار آهن: github.com/Rusldv/bcstartup/tree/master/blockchain

هن کي ڪرڻ لاء، بلاڪ کي IBlock انٽرفيس کي لاڳو ڪرڻ گهرجي:

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

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

}

ڊيٽابيس ڪنيڪشن هڪ ڀيرو ٺاهي ويندي آهي جڏهن پيڪيج کي شروع ڪيو ويندو آهي init() فنڪشن:

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

CloseDB() db.Cloce() لاءِ هڪ لفافي آهي - ڊيٽابيس سان ڪنيڪشن کي بند ڪرڻ لاءِ پيڪيج جي ڪم سان ڪم ڪرڻ کان پوءِ سڏيو ويندو آهي.

SetTargetBlockHash(hash string) error function موجوده بلاڪ جي هيش کي ڊيٽابيس ۾ BLOCK_HASH مستقل طرفان مخصوص ڪيل ڪيئي سان لکي ٿو.

GetTargetBlockHash() (string، error) فنڪشن ڊيٽابيس ۾ محفوظ ڪيل موجوده بلاڪ جي هيش کي واپس ڪري ٿو.

SetTargetBlockHeight(height int) ايرر فنڪشن ڊيٽابيس ڏانهن نوڊ لاءِ بلاڪچين جي اوچائي جي قيمت BLOCK_HEIGHT مسلسل طرفان مخصوص ڪيل ڪي سان لکي ٿو.

GetTargetBlockHeight() (int، error) فنڪشن بلاڪچين جي اوچائي کي واپس ڏئي ٿو ڏنل نوڊ لاءِ، ڊيٽابيس ۾ محفوظ ٿيل.

CheckBlock (بلاڪ IBlock) bool فنڪشن هن بلاڪ کي بلاڪچين ۾ شامل ڪرڻ کان اڳ صحيحيت لاءِ هڪ بلاڪ چيڪ ڪري ٿو.

AddBlock (بلاڪ IBlock) غلطي فنڪشن بلاڪ کي بلاڪ ۾ شامل ڪري ٿو.

بلاڪ کي ٻيهر حاصل ڪرڻ ۽ ڏسڻ جا ڪم بلاڪچين پيڪيج جي explore.go فائل ۾ آهن:

GetBlockByHash(hash string) (*block.Block، error) فنڪشن هڪ خالي بلاڪ اعتراض ٺاهي ٿو، ڊيٽابيس مان ان ۾ هڪ بلاڪ لوڊ ڪري ٿو، جنهن جو هيش ان ڏانهن گذريو ويو، ۽ ان ڏانهن هڪ پوائنٽر واپس ڪري ٿو.

پيدائش واري بلاڪ جي پيدائش جينيسس() غلطي فنڪشن جي ذريعي ڪئي وئي آهي بلاڪچين پيڪيج جي genesis.go فائل مان.

ايندڙ آرٽيڪل ويب ساکٽ ميکانيزم استعمال ڪندي نوڊ سان ڪلائنٽ کي ڳنڍڻ بابت ڳالهائيندو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو