ကျလန်ုပ်၏ Go blockchain တလင် လုပ်ကလက်မျာသနဟင့် ငလေပေသငလေယူမျာသကို ဒီဇိုင်သရေသဆလဲနည်သ

ဒေတာဘေ့စ်တစ်ခုသာမက blockchain တစ်ခုနဟင့်အဆုံသသတ်ရန်အတလက်၊ ကျလန်ုပ်တို့၏ပရောဂျက်တလင် အရေသကဌီသသောဒဌပ်စင် 3 ခုကို ထည့်သလင်သရန်လိုအပ်သည်-

  • ဘလောက်ဒေတာတည်ဆောက်ပုံနဟင့် နည်သလမ်သမျာသကို ဖော်ပဌချက်
  • ဒေတာဖလဲ့စည်သပုံနဟင့် ငလေပေသငလေယူနည်သလမ်သမျာသ၏ ဖော်ပဌချက်
  • ဒေတာဘေ့စ်တစ်ခုတလင် ဘလောက်မျာသကို သိမ်သဆည်သပဌီသ ၎င်သတို့၏ hash သို့မဟုတ် အမဌင့် (သို့မဟုတ် အခဌာသအရာတစ်ခုခု) ဖဌင့် ၎င်သတို့ကို ထိုနေရာတလင် ရဟာတလေ့သည့် Blockchain လုပ်ဆောင်ချက်မျာသ။

ကျလန်ုပ်၏ Go blockchain တလင် လုပ်ကလက်မျာသနဟင့် ငလေပေသငလေယူမျာသကို ဒီဇိုင်သရေသဆလဲနည်သ

ကသည်မဟာစက်မဟုလုပ်ငန်သအတလက် blockchain နဟင့်ပတ်သက်သောဒုတိယဆောင်သပါသဖဌစ်သည်၊ ပထမ ဒီမဟာ.

ကစီသရီသရဟိယခင်ဆောင်သပါသနဟင့် ပတ်သက်၍ စာဖတ်သူမျာသမေသခဲ့သောမေသခလန်သမျာသကို မဟတ်သာသထာသသင့်သည်- ကကိစ္စတလင်၊ LevelDB ဒေတာဘေ့စ်ကို 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 အတလက်)၊ ထိုငလေပေသငလေယူ၏ hash၊ ငလေပေသငလေယူအမျိုသအစာသ၊ အချိန်တံဆိပ်၊ သလင်သအာသစုနဟင့် အထလက်မျာသကို သိမ်သဆည်သထာသသည်။ TxIn သည် အထလက်အာသရည်ညလဟန်သထာသသော ငလေပေသငလေယူ၏ hash၊ ကအထလက်နဟင့် ဘိုက်ကုဒ်နံပါတ်နဟင့် TxOut အထလက်မျာသသည် တန်ဖိုသအချို့နဟင့် bytecode တို့ကို သိမ်သဆည်သထာသသည်။

ယခု ၎င်သ၏ဒေတာတလင် ငလေပေသငလေယူလုပ်ဆောင်နိုင်သည့် လုပ်ဆောင်ချက်မျာသကို ကဌည့်ကဌပါစို့။ နည်သလမ်သတလေကို လေ့လာကဌည့်ရအောင်။

ငလေပေသငလေယူဖန်တီသရန်၊ ငလေပေသငလေယူ။NewTransaction(txtype byte) *TX လုပ်ဆောင်ချက်ကို အသုံသပဌုပါ။

AddTxIn(thattxhash []byte၊ txoutn int၊ code []byte) (*TxIn၊ error) နည်သလမ်သသည် ငလေပေသငလေယူသို့ ထည့်သလင်သမဟုတစ်ခု ပေါင်သထည့်သည်။

AddTxOut(value int၊ data []byte) (*TxOut၊ error) method သည် ငလေပေသငလေယူသို့ output တစ်ခုကို ပေါင်သထည့်သည်။

ToBytes() []byte နည်သလမ်သသည် ငလေပေသငလေယူကို byte အချပ်အဖဌစ် ပဌောင်သလဲပေသသည်။

အတလင်သလုပ်ဆောင်ချက် preByteHash(bytes []byte) string ကို Build() နဟင့် Check() တလင် JavaScript အက်ပ်လီကေသရဟင်သမျာသမဟ ထုတ်ပေသသော ငလေပေသငလေယူ hash မျာသကို ထုတ်ပေသသော ငလေပေသငလေယူ hash ကို သဟဇာတဖဌစ်စေရန်အတလက် အသုံသပဌုပါသည်။

Build() နည်သလမ်သသည် ငလေပေသငလေယူ hash ကို အောက်ပါအတိုင်သ သတ်မဟတ်သည်- tx.TxHash = preByteHash(tx.ToBytes())။

ToJSON() စာကဌောင်သနည်သလမ်သသည် ငလေပေသငလေယူတစ်ခုအာသ JSON စာကဌောင်သအဖဌစ်သို့ ပဌောင်သလဲပေသသည်။

FromJSON(ဒေတာ []byte) အမဟာသနည်သလမ်သသည် ဘိုက်အချပ်တစ်ခုအဖဌစ်ဖဌတ်သန်သသလာသသော JSON ဖော်မတ်မဟ ငလေပေသငလေယူတစ်ခုကို တင်ပါသည်။

Check() bool နည်သလမ်သသည် ငလေပေသငလေယူ hash အကလက်မဟ ရရဟိလာသော hash ကို ဟက်ခ်ျခဌင်သ ( hash အကလက်ကို လျစ်လျူရဟုခဌင်သ) ကဌောင့် ရရဟိသော hash နဟင့် နဟိုင်သယဟဉ်ပါသည်။

ငလေပေသငလေယူမျာသကို ဘလောက်သို့ ပေါင်သထည့်သည်- 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 သည် ဒေတာအမျိုသအစာသကို သိမ်သဆည်သသည်၊ node သည် ၎င်သကိုအသုံသပဌုပဌီသ block ကို ငလေပေသငလေယူ သို့မဟုတ် အခဌာသဒေတာနဟင့် ခလဲခဌာသသည်။ ဘလောက်တစ်ခုအတလက် ကတန်ဖိုသသည် 1 ဖဌစ်သည်။

BlockHeight သည် ဘလောက်၏အမဌင့်ကို သိမ်သဆည်သသည်။
Timestamp အချိန်တံဆိပ်
HeaderSize သည် bytes အတလင်သရဟိ ပိတ်ဆို့အရလယ်အစာသ ဖဌစ်သည်။
PrevBlockHash သည် ယခင်ဘလောက်၏ hash ဖဌစ်ပဌီသ SelfBlockHash သည် လက်ရဟိတစ်ခု၏ hash ဖဌစ်သည်။
TxsHash သည် ငလေပေသငလေယူမျာသ၏ ယေဘုယျ hash တစ်ခုဖဌစ်သည်။
MerkleRoot သည် Merkle သစ်ပင်၏အမဌစ်ဖဌစ်သည်။

ထို့အပဌင် အကလက်မျာသတလင် ဘလောက်ဖန်တီသသူ၏ အမျာသသူငဟာသော့၊ ဖန်တီသသူ၏ လက်မဟတ်၊ ဘလောက်ဗာသရဟင်သ၊ ဘလောက်အတလင်သရဟိ ငလေပေသငလေယူအရေအတလက်နဟင့် ကငလေပေသငလေယူမျာသကိုယ်တိုင် ရဟိနေပါသည်။

၎င်သ၏နည်သလမ်သမျာသကိုကဌည့်ရဟုကဌပါစို့။
ဘလောက်တစ်ခုဖန်တီသရန်၊ block.NewBlock() လုပ်ဆောင်ချက်ကို အသုံသပဌုပါ- NewBlock(prevBlockHash string, height int) *Block၊ ၎င်သသည် ယခင် block ၏ hash နဟင့် blockchain ရဟိ ဖန်တီသထာသသော block အတလက် သတ်မဟတ်ထာသသော အမဌင့်ကို ယူဆောင်သည်။ ပိတ်ဆို့အမျိုသအစာသကို အမျိုသအစာသမျာသ ပက်ကေ့ဂျ်ကိန်သသေမျာသမဟလည်သ သတ်မဟတ်သည်-

b.DataType = types.BLOCK_TYPE.

AddTx(tx *transaction.TX) နည်သလမ်သသည် ဘလောက်တစ်ခုသို့ ငလေပေသငလေယူကို ပေါင်သထည့်သည်။

Build() နည်သလမ်သသည် တန်ဘိုသမျာသကို block ၏ အကလက်မျာသထဲသို့ တင်ပဌီသ ၎င်သ၏ လက်ရဟိ hash ကို ထုတ်ပေသပဌီသ သတ်မဟတ်ပေသသည်။

ToBytesHeader() []byte method သည် block header (အရောင်သအ၀ယ်မလုပ်ဘဲ) byte slice အဖဌစ်သို့ ပဌောင်သလဲပေသပါသည်။

ToJSON() string method သည် data ၏ string ကိုကိုယ်စာသပဌုသော block ကို JSON ဖော်မတ်သို့ ပဌောင်သပေသသည်။

FromJSON(data []byte) အမဟာသနည်သလမ်သသည် JSON မဟဒေတာမျာသကို ပိတ်ဆို့ဖလဲ့စည်သပုံသို့ တင်ပါသည်။

Check() bool method သည် block hash တစ်ခုကို ထုတ်ပေသပဌီသ block hash အကလက်တလင် သတ်မဟတ်ထာသသည့် တစ်ခုနဟင့် နဟိုင်သယဟဉ်ပါသည်။

GetTxsHash() string method သည် block ရဟိ ငလေပေသငလေယူအာသလုံသ၏ စုစုပေါင်သ hash ကို ပဌန်ပေသသည်။

GetMerkleRoot() နည်သလမ်သသည် ဘလောက်တစ်ခုတလင် ငလေပေသငလေယူမျာသအတလက် Merkle သစ်ပင်၏ အမဌစ်ကို သတ်မဟတ်သည်။

ဆိုင်သဘုတ်(privk string) နည်သလမ်သသည် ပိတ်ဆို့ဖန်တီသသူ၏ သီသသန့်သော့ဖဌင့် ပိတ်ဆို့ခဌင်သကို လက်မဟတ်ရေသထိုသသည်။

SetHeight(height int) method သည် block ၏ အမဌင့်ကို block structure field သို့ ရေသပေသသည်။

GetHeight() int method သည် block structure ၏ သက်ဆိုင်ရာနယ်ပယ်တလင် သတ်မဟတ်ထာသသည့်အတိုင်သ block ၏ အမဌင့်ကို ပဌန်ပေသသည်။

ToGOBBytes() []byte နည်သလမ်သသည် ဘလောက်တစ်ခုကို GOB ဖော်မတ်ဖဌင့် ကုဒ်လုပ်ပဌီသ ဘိုက်အချပ်အဖဌစ် ပဌန်ပေသသည်။

FromGOBBytes(ဒေတာ []byte) အမဟာသနည်သလမ်သသည် GOB ဖော်မတ်ဖဌင့် ဖဌတ်သလာသသော ဘိုက်အချပ်မဟ ပိတ်ဆို့ဖလဲ့စည်သပုံသို့ ပိတ်ဆို့ဒေတာကို ရေသသည်။

GetHash() string method သည် ပေသထာသသော block ၏ hash ကို ပဌန်ပေသသည်။

GetPrevHash() string method သည် ယခင် block ၏ hash ကို ပဌန်ပေသသည်။

SetPublicKey(pubk string) နည်သလမ်သသည် ပိတ်ဆို့ဖန်တီသသူ၏ အမျာသသူငဟာသော့ကို ဘလောက်တလင် ရေသသာသသည်။

ထို့ကဌောင့် Block object ၏နည်သလမ်သမျာသကို အသုံသပဌု၍ ၎င်သကို ကလန်ရက်မဟတဆင့် ထုတ်လလဟင့်ခဌင်သအတလက် ဖော်မတ်အဖဌစ်သို့ ပဌောင်သလဲနိုင်ပဌီသ LevelDB ဒေတာဘေ့စ်သို့ သိမ်သဆည်သနိုင်ပါသည်။

blockchain package ၏လုပ်ဆောင်ချက်မျာသသည် blockchain သို့သိမ်သဆည်သရန်အတလက်တာဝန်ရဟိသည်။ github.com/Rusldv/bcstartup/tree/master/blockchain

ဒါကိုလုပ်ဖို့၊ block သည် IBlock interface ကိုအကောင်အထည်ဖော်ရပါမည်-

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() အတလက် ထုပ်ပိုသခဌင်သဖဌစ်သည် - ဒေတာဘေ့စ်နဟင့်ချိတ်ဆက်မဟုကိုပိတ်ရန် package functions မျာသနဟင့်အတူအလုပ်လုပ်ပဌီသနောက်ဟုခေါ်သည်။

SetTargetBlockHash(hash string) error function သည် BLOCK_HASH constant မဟ သတ်မဟတ်ထာသသော သော့ဖဌင့် လက်ရဟိ block ၏ hash ကို ရေသသာသပါသည်။

GetTargetBlockHash() (string, error) လုပ်ဆောင်ချက်သည် ဒေတာဘေ့စ်တလင် သိမ်သဆည်သထာသသော လက်ရဟိဘလောက်၏ hash ကို ပဌန်ပေသသည်။

SetTargetBlockHeight(height int) အမဟာသလုပ်ဆောင်ချက်သည် BLOCK_HEIGHT မဟသတ်မဟတ်ထာသသောသော့ဖဌင့် node အတလက် blockchain အမဌင့်တန်ဖိုသကို database သို့ စာရေသသည်။

GetTargetBlockHeight() (int, error) လုပ်ဆောင်ချက်သည် ဒေတာဘေ့စ်တလင် သိမ်သဆည်သထာသသော ပေသထာသသော node တစ်ခုအတလက် blockchain ၏ အမဌင့်ကို ပဌန်ပေသသည်။

CheckBlock(block IBlock) bool function သည် blockchain သို့မထည့်မီ block တစ်ခုကို စစ်ဆေသပါသည်။

AddBlock(block IBlock) error function သည် blockchain သို့ block တစ်ခုကို ပေါင်သထည့်သည်။

blocks မျာသကို ပဌန်လည်ရယူခဌင်သနဟင့် ကဌည့်ရဟုခဌင်သအတလက် လုပ်ဆောင်ချက်မျာသသည် blockchain package ၏ explore.go ဖိုင်တလင် ရဟိသည်-

GetBlockByHash(hash string) (*block.Block, error) လုပ်ဆောင်ချက်သည် အလလတ်ပိတ်ဆို့သည့်အရာဝတ္ထုတစ်ခုကို ဖန်တီသပဌီသ၊ ဒေတာဘေ့စ်မဟ ဘလောက်တစ်ခုကို တင်ကာ၊ ၎င်သထံပေသပို့သည့် hash နဟင့် ၎င်သထံသို့ ညလဟန်ပဌချက်ကို ပဌန်ပေသသည်။

genesis block တစ်ခုဖန်တီသခဌင်သကို blockchain package ၏ genesis.go ဖိုင်မဟ Genesis() error function ဖဌင့်လုပ်ဆောင်သည်။

နောက်ဆောင်သပါသတလင် WebSocket ယန္တရာသကို အသုံသပဌု၍ သုံသစလဲသူမျာသအာသ node တစ်ခုသို့ ချိတ်ဆက်ခဌင်သအကဌောင်သ ဆလေသနလေသပါမည်။

source: www.habr.com

မဟတ်ချက် Add