میں نے اپنے گو بلاک چین میں بلاکس اور لین دین کو کس طرح ڈیزائن کیا۔

بالآخر بلاک چین کے ساتھ ختم کرنے کے لیے نہ کہ صرف ایک ڈیٹا بیس کے لیے، ہمیں اپنے پروجیکٹ میں 3 اہم عناصر کو شامل کرنے کی ضرورت ہے:

  • بلاک ڈیٹا کی ساخت اور طریقوں کی تفصیل
  • ڈیٹا کی ساخت اور لین دین کے طریقوں کی تفصیل
  • بلاکچین فنکشنز جو بلاکس کو ڈیٹابیس میں محفوظ کرتے ہیں اور انہیں ان کے ہیش یا اونچائی (یا کچھ اور) سے وہاں تلاش کرتے ہیں۔

میں نے اپنے گو بلاک چین میں بلاکس اور لین دین کو کس طرح ڈیزائن کیا۔

یہ صنعت کے لیے بلاک چین کے بارے میں دوسرا مضمون ہے، پہلا یہاں.

ان سوالات کو یاد کرتے ہوئے جو قارئین نے اس سیریز میں پچھلے مضمون کے بارے میں مجھ سے پوچھے تھے، یہ نوٹ کرنا چاہیے: اس معاملے میں، لیول ڈی بی ڈیٹا بیس کو بلاکچین ڈیٹا کو ذخیرہ کرنے کے لیے استعمال کیا جاتا ہے، لیکن کوئی بھی چیز آپ کو کسی دوسرے، یعنی 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 آؤٹ پٹ کچھ قدر اور بائیک کوڈ بھی اسٹور کرتے ہیں۔

اب دیکھتے ہیں کہ کوئی ٹرانزیکشن اپنے ڈیٹا پر کیا کام کر سکتا ہے، یعنی آئیے طریقے دیکھتے ہیں۔

ٹرانزیکشن بنانے کے لیے، transaction.NewTransaction(txtype byte) *TX فنکشن استعمال کریں۔

AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) طریقہ ٹرانزیکشن میں ایک ان پٹ کا اضافہ کرتا ہے۔

AddTxOut(value int, data []byte) (*TxOut, error) طریقہ ٹرانزیکشن میں آؤٹ پٹ کا اضافہ کرتا ہے۔

ToBytes() []بائٹ طریقہ ٹرانزیکشن کو بائٹ سلائس میں بدل دیتا ہے۔

اندرونی فنکشن preByteHash(bytes []byte) سٹرنگ کو Build() اور Check() میں استعمال کیا جاتا ہے تاکہ جنریٹڈ ٹرانزیکشن ہیش کو JavaScript ایپلی کیشنز سے تیار کردہ ٹرانزیکشن ہیش کے ساتھ ہم آہنگ بنایا جا سکے۔

Build() طریقہ ٹرانزیکشن ہیش کو اس طرح سیٹ کرتا ہے: tx.TxHash = preByteHash(tx.ToBytes())۔

ToJSON() سٹرنگ کا طریقہ ٹرانزیکشن کو JSON سٹرنگ میں تبدیل کرتا ہے۔

FromJSON(data []byte) غلطی کا طریقہ JSON فارمیٹ سے لین دین کو لوڈ کرتا ہے جسے بائٹ سلائس کے طور پر پاس کیا گیا ہے۔

چیک() بول طریقہ ٹرانزیکشن ہیش فیلڈ سے نتیجے میں آنے والی ہیش کا موازنہ اس ٹرانزیکشن کو ہیش کرنے کے نتیجے میں حاصل ہونے والی ہیش سے کرتا ہے (ہیش فیلڈ کو نظر انداز کرتے ہوئے)۔

لین دین کو بلاک میں شامل کیا گیا ہے: 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
}

ڈیٹا ٹائپ ڈیٹا کی قسم کو اسٹور کرتا ہے، نوڈ اسے استعمال کرتا ہے اور بلاک کو ٹرانزیکشن یا دوسرے ڈیٹا سے ممتاز کرتا ہے۔ ایک بلاک کے لیے یہ قدر 1 ہے۔

BlockHeight بلاک کی اونچائی کو محفوظ کرتا ہے۔
ٹائم اسٹیمپ ٹائم اسٹیمپ۔
HeaderSize بائٹس میں بلاک سائز ہے۔
PrevBlockHash پچھلے بلاک کی ہیش ہے، اور SelfBlockHash موجودہ بلاک کی ہیش ہے۔
TxsHash لین دین کا ایک عام ہیش ہے۔
مرکل روٹ مرکل کے درخت کی جڑ ہے۔

مزید فیلڈز میں بلاک کے تخلیق کار کی عوامی کلید، تخلیق کار کے دستخط، بلاک کا ورژن، بلاک میں لین دین کی تعداد، اور یہ لین دین خود ہوتے ہیں۔

آئیے اس کے طریقے دیکھتے ہیں:
بلاک بنانے کے لیے، block.NewBlock() فنکشن استعمال کریں: NewBlock(prevBlockHash string, height int) *بلاک، جو پچھلے بلاک کی ہیش لیتا ہے اور بلاکچین میں بنائے گئے بلاک کے لیے اونچائی سیٹ کرتا ہے۔ بلاک کی قسم بھی قسم کے پیکیج مستقل سے سیٹ کی گئی ہے:

b.DataType = types.BLOCK_TYPE.

AddTx(tx *transaction.TX) طریقہ ایک بلاک میں ٹرانزیکشن کا اضافہ کرتا ہے۔

Build() طریقہ بلاک کے فیلڈز میں ویلیو لوڈ کرتا ہے اور اس کی موجودہ ہیش کو جنریٹ اور سیٹ کرتا ہے۔

ToBytesHeader() []بائٹ طریقہ بلاک ہیڈر (بغیر لین دین کے) کو بائٹ سلائس میں تبدیل کرتا ہے۔

ToJSON() سٹرنگ کا طریقہ ڈیٹا کی سٹرنگ نمائندگی میں بلاک کو JSON فارمیٹ میں تبدیل کرتا ہے۔

FromJSON(data []byte) غلطی کا طریقہ JSON سے ڈیٹا کو بلاک ڈھانچے میں لوڈ کرتا ہے۔

چیک () بول طریقہ ایک بلاک ہیش تیار کرتا ہے اور اس کا موازنہ بلاک ہیش فیلڈ میں بیان کردہ طریقہ سے کرتا ہے۔

GetTxsHash() سٹرنگ کا طریقہ بلاک میں تمام لین دین کی کل ہیش واپس کرتا ہے۔

GetMerkleRoot() طریقہ ایک بلاک میں لین دین کے لیے Merkle درخت کی جڑ کی وضاحت کرتا ہے۔

سائن (privk سٹرنگ) طریقہ بلاک بنانے والے کی نجی کلید کے ساتھ ایک بلاک پر دستخط کرتا ہے۔

SetHeight(height int) طریقہ بلاک کی اونچائی کو بلاک سٹرکچر فیلڈ میں لکھتا ہے۔

GetHeight() int طریقہ بلاک کی اونچائی واپس کرتا ہے جیسا کہ بلاک ڈھانچے کے متعلقہ فیلڈ میں بیان کیا گیا ہے۔

ToGOBBytes() []byte طریقہ GOB فارمیٹ میں بلاک کو انکوڈ کرتا ہے اور اسے بائٹ سلائس کے طور پر واپس کرتا ہے۔

FromGOBBytes(data []byte) ایرر کا طریقہ GOB فارمیٹ میں پاس کردہ بائٹ سلائس سے بلاک ڈھانچے میں بلاک ڈیٹا لکھتا ہے۔

GetHash() سٹرنگ کا طریقہ دیئے گئے بلاک کی ہیش کو لوٹاتا ہے۔

GetPrevHash() سٹرنگ کا طریقہ پچھلے بلاک کی ہیش کو لوٹاتا ہے۔

SetPublicKey(pubk string) طریقہ بلاک کے تخلیق کار کی عوامی کلید کو بلاک پر لکھتا ہے۔

اس طرح، بلاک آبجیکٹ کے طریقوں کو استعمال کرتے ہوئے، ہم اسے آسانی سے نیٹ ورک پر ٹرانسمیشن اور لیول ڈی بی ڈیٹا بیس میں محفوظ کرنے کے لیے فارمیٹ میں تبدیل کر سکتے ہیں۔

بلاکچین پیکیج کے افعال بلاکچین کو بچانے کے لیے ذمہ دار ہیں: 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) ایرر فنکشن موجودہ بلاک کی ہیش کو ڈیٹا بیس میں BLOCK_HASH مستقل کی طرف سے مخصوص کلید کے ساتھ لکھتا ہے۔

GetTargetBlockHash() (سٹرنگ، ایرر) فنکشن ڈیٹا بیس میں محفوظ موجودہ بلاک کی ہیش کو واپس کرتا ہے۔

SetTargetBlockHeight(height int) ایرر فنکشن ڈیٹا بیس کو BLOCK_HEIGHT کانسٹینٹ کے ذریعے مخصوص کلید کے ساتھ نوڈ کے لیے بلاکچین اونچائی کی قدر لکھتا ہے۔

GetTargetBlockHeight() (int, error) فنکشن ڈیٹابیس میں محفوظ کیے گئے نوڈ کے لیے بلاکچین کی اونچائی لوٹاتا ہے۔

چیک بلاک (بلاک آئی بلاک) بول فنکشن اس بلاک کو بلاکچین میں شامل کرنے سے پہلے ایک بلاک کو درستگی کے لیے چیک کرتا ہے۔

ایڈ بلاک (بلاک آئی بلاک) ایرر فنکشن بلاکچین میں ایک بلاک کا اضافہ کرتا ہے۔

بلاکس کو دوبارہ حاصل کرنے اور دیکھنے کے افعال بلاکچین پیکیج کی explore.go فائل میں ہیں:

GetBlockByHash(hash string) (*block.Block، error) فنکشن ایک خالی بلاک آبجیکٹ بناتا ہے، ڈیٹا بیس سے اس میں ایک بلاک لوڈ کرتا ہے، جس کا ہیش اسے پاس کیا گیا تھا، اور اس پر ایک پوائنٹر لوٹاتا ہے۔

جینیسس بلاک کی تخلیق Genesis() ایرر فنکشن بلاکچین پیکج کی genesis.go فائل سے کی جاتی ہے۔

اگلا مضمون ویب ساکٹ میکانزم کا استعمال کرتے ہوئے کلائنٹس کو نوڈ سے جوڑنے کے بارے میں بات کرے گا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں