د دې لپاره چې په نهایت کې د بلاکچین سره پای ته ورسیږو او نه یوازې ډیټابیس ، موږ اړتیا لرو زموږ پروژې ته 3 مهم عناصر اضافه کړو:
- د بلاک ډیټا جوړښت او میتودونو توضیحات
- د معلوماتو جوړښت او د راکړې ورکړې میتودونو توضیحات
- د بلاکچین فعالیتونه چې په ډیټابیس کې بلاکونه خوندي کوي او د دوی د هش یا لوړوالي (یا بل څه) له مخې یې موندلی شي.
دا د صنعت لپاره د بلاکچین په اړه دویمه مقاله ده، لومړی
د هغه پوښتنو په یادولو سره چې لوستونکو له ما څخه پدې لړۍ کې د تیرې مقالې په اړه وپوښتل ، دا باید په یاد ولرئ: پدې حالت کې ، د لیول ډی بی ډیټابیس د بلاکچین ډیټا ذخیره کولو لپاره کارول کیږي ، مګر هیڅ شی تاسو د بل کارولو څخه منع نه کوي ، ووایه ، MySQL. اوس راځئ چې د دې معلوماتو جوړښت وګورو.
راځئ چې د معاملو سره پیل وکړو:
دلته د دې ډاټا جوړښت دی:
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 میتود د لیږد هش ساحې څخه پایله شوي هش د دې لیږد د هش کولو په پایله کې ترلاسه شوي هش سره پرتله کوي (د هش ساحې له پامه غورځول).
لیږدونه په بلاک کې اضافه شوي:
د بلاک ډیټا جوړښت خورا لوی دی:
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ه بدل کړو.
د بلاکچین کڅوړې دندې بلاکچین ته د خوندي کولو مسؤلیت لري:
د دې کولو لپاره، بلاک باید د 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