څنګه ما په خپل ګو بلاکچین کې بلاکونه او لیږدونه ډیزاین کړل

د دې لپاره چې په نهایت کې د بلاکچین سره پای ته ورسیږو او نه یوازې ډیټابیس ، موږ اړتیا لرو زموږ پروژې ته 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 inputs د لیږد هش ذخیره کوي چې محصول یې حواله شوی ، د دې محصول شمیره او بایټ کوډ ، او د TxOut محصول یو څه ارزښت او همدارنګه بایټ کوډ ذخیره کوي.

اوس راځئ وګورو چې کوم عملونه کولی شي په خپل ډیټا کې ترسره کړي، د بیلګې په توګه. راځئ چې میتودونه وګورو.

د لیږد رامینځته کولو لپاره ، د لیږد نوي لیږد (txtype byte) *TX فنکشن وکاروئ.

د AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn، تېروتنه) طریقه د راکړې ورکړې لپاره ان پټ اضافه کوي.

د AddTxOut (value int، data []byte) (*TxOut، تېروتنه) طریقه د راکړې ورکړې لپاره محصول اضافه کوي.

د ToBytes() []بایټ میتود معامله په بایټ سلائس بدلوي.

داخلي فعالیت preByteHash(bytes []byte) تار په Build() او Check() کې کارول کیږي ترڅو تولید شوي لیږد هش د جاواسکریپټ غوښتنلیکونو څخه رامینځته شوي لیږد هش سره مطابقت ولري.

د جوړونې () میتود د لیږد هش په لاندې ډول تنظیموي: 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 د مرکل د ونې ريښه ده.

په نورو برخو کې د بلاک د جوړونکي عامه کیلي شتون لري، د جوړونکي لاسلیک، د بلاک نسخه، په بلاک کې د معاملو شمیر، او دا لیږدونه پخپله.

راځئ چې طریقې یې وګورو:
د بلاک جوړولو لپاره، د block.NewBlock() فنکشن وکاروئ: NewBlock(prevBlockHash string, height int) *Block، کوم چې د پخواني بلاک هش اخلي او په بلاکچین کې د جوړ شوي بلاک لپاره ټاکل شوی لوړوالی. د بلاک ډول هم د ډولونو کڅوړې ثابت څخه تنظیم شوی:

b.DataType = types.BLOCK_TYPE.

د AddTx(tx *transaction.TX) میتود یو بلاک ته لیږد اضافه کوي.

د Build() میتود د بلاک په ساحو کې ارزښتونه پورته کوي او خپل اوسنی هش تولیدوي او تنظیموي.

د ToBytesHeader() []بایټ میتود د بلاک سرلیک (پرته له معاملو) په بایټ سلائس بدلوي.

د ToJSON() سټرینګ میتود بلاک د JSON فارمیټ ته د ډیټا په نمایش کې بدلوي.

د FromJSON(data []byte) تېروتنه طریقه د JSON څخه ډیټا په بلاک جوړښت کې باروي.

د Check() bool میتود د بلاک هش تولیدوي او د بلاک هش په ساحه کې مشخص شوي سره پرتله کوي.

د GetTxsHash() تار طریقه په بلاک کې د ټولو معاملو ټول هش بیرته راګرځوي.

د GetMerkleRoot() طریقه په بلاک کې د معاملو لپاره د Merkle د ونې ریښه مشخصوي.

د نښه (privk تار) میتود د بلاک جوړونکي شخصي کیلي سره بلاک لاسلیک کوي.

د SetHeight(hight int) میتود د بلاک جوړښت ساحې ته د بلاک لوړوالی لیکي.

د GetHeight() int میتود د بلاک لوړوالی بیرته راګرځوي لکه څنګه چې د بلاک جوړښت اړوند ساحه کې مشخص شوی.

د ToGOBBytes() []بایټ طریقه د GOB بڼه کې یو بلاک کوډ کوي او د بایټ سلائس په توګه یې بیرته راګرځوي.

د FromGOBBytes(data []byte) تېروتنه طریقه د GOB په بڼه کې د پاس شوي بایټ سلائس څخه د بلاک جوړښت ته د بلاک ډاټا لیکي.

د GetHash() تار طریقه د ورکړل شوي بلاک هش بیرته راګرځوي.

د GetPrevHash() تار طریقه د پخواني بلاک هش بیرته راګرځوي.

د SetPublicKey (pubk string) میتود بلاک ته د بلاک جوړونکي عامه کیلي لیکي.

پدې توګه ، د بلاک اعتراض میتودونو په کارولو سره ، موږ کولی شو دا په اسانۍ سره په شبکه کې د لیږد لپاره او د LevelDB ډیټابیس ته خوندي کولو لپاره په ب formatه بدل کړو.

د بلاکچین کڅوړې دندې بلاکچین ته د خوندي کولو مسؤلیت لري: 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() (string, error) فنکشن په ډیټابیس کې د موجوده بلاک هش بیرته راګرځوي.

د SetTargetBlockHeight(height int) تېروتنه فنکشن ډیټابیس ته د نوډ لپاره د بلاکچین لوړوالی ارزښت د BLOCK_HEIGHT ثابت لخوا مشخص شوي کلیدي سره لیکي.

د GetTargetBlockHeight() (int, error) فنکشن د ورکړل شوي نوډ لپاره د بلاکچین لوړوالی بیرته راګرځوي، په ډیټابیس کې زیرمه شوي.

د چیک بلاک (بلاک IBlock) بول فنکشن بلاکچین ته د دې بلاک اضافه کولو دمخه د سموالي لپاره بلاک چیک کوي.

د اډ بلاک (بلاک IBlock) خطا فعالیت بلاکچین ته یو بلاک اضافه کوي.

د بلاکونو د ترلاسه کولو او لیدو لپاره دندې د بلاکچین کڅوړې explore.go فایل کې دي:

د GetBlockByHash(hash string) (*block.Block، error) فنکشن یو خالي بلاک څیز رامینځته کوي، د ډیټابیس څخه په دې کې یو بلاک باروي، هغه هش چې ورته لیږدول شوی و، او یو پوائنټر بیرته راګرځوي.

د جینیسس بلاک رامینځته کول د بلاکچین کڅوړې genesis.go فایل څخه د جینیسس () خطا فعالیت لخوا ترسره کیږي.

راتلونکی مقاله به د ویب ساکټ میکانیزم په کارولو سره نوډ ته د پیرودونکو وصل کولو په اړه وغږیږي.

سرچینه: www.habr.com

Add a comment