በዳታቤዝ ብቻ ሳይሆን በመጨረሻ በብሎክቼይን ለመጨረስ፣ ወደ ፕሮጀክታችን 3 አስፈላጊ ነገሮችን ማከል አለብን።
- የማገጃ ውሂብ መዋቅር እና ዘዴዎች መግለጫ
- የውሂብ መዋቅር እና የግብይት ዘዴዎች መግለጫ
- ብሎኮችን በመረጃ ቋት ውስጥ የሚያስቀምጡ እና በሃሽ ወይም በቁመታቸው (ወይም በሌላ ነገር) የሚያገኟቸው Blockchain ተግባራት።
ይህ ስለ blockchain ለኢንዱስትሪ ሁለተኛው ጽሑፍ ነው, የመጀመሪያው
በዚህ ተከታታይ ውስጥ ስላለፈው ጽሑፍ አንባቢዎች የጠየቁኝን ጥያቄዎች በማስታወስ ልብ ሊባል የሚገባው ጉዳይ ነው-በዚህ ጉዳይ ላይ የLevelDB ዳታቤዝ የማገጃ ቼይን መረጃን ለማከማቸት ጥቅም ላይ ይውላል ፣ ግን ምንም ሌላ ማንኛውንም ነገር እንዳይጠቀሙ የሚከለክልዎት ነገር የለም ፣ 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 ግብዓቶች የግብይቱን ሃሽ ያከማቻሉ ውጤታቸው የተጠቀሰው፣ የዚህ ውፅዓት ቁጥር እና ባይትኮድ፣ እና TxOut ውፅዓቶች የተወሰነ እሴት እና እንዲሁም ባይትኮድ ያከማቻሉ።
አሁን አንድ ግብይት በውሂቡ ላይ ምን አይነት እርምጃዎችን እንደሚፈጽም እንይ፣ ማለትም ዘዴዎቹን እንመልከት።
ግብይት ለመፍጠር፣ ግብይቱን ይጠቀሙ።NewTransaction(txtype byte) *TX ተግባር።
የ AddTxIn(thattxhash []byte፣ txoutn int፣ code []byte) (*TxIn፣ስህተት) ዘዴ ለግብይቱ ግብአት ይጨምራል።
የAddTxOut(ዋጋ int፣ ዳታ [] ባይት) (*TxOut፣ስህተት) ዘዴ ለግብይቱ ውጤትን ይጨምራል።
የቶባይስ() [] ባይት ዘዴ ግብይቱን ወደ ባይት ቁራጭ ይቀይረዋል።
የመነጨውን የግብይት ሃሽ ከጃቫስክሪፕት አፕሊኬሽኖች ከሚመነጩ የግብይት ሃሽ ጋር እንዲስማማ ለማድረግ የውስጣዊ ተግባር preByteHash(ባይት []ባይት) ሕብረቁምፊ በBuild() እና Check() ላይ ጥቅም ላይ ይውላል።
የBuild() ዘዴ የግብይቱን ሃሽ እንደሚከተለው ያዘጋጃል፡ tx.TxHash = preByteHash(tx.ToBytes())።
የToJSON() ሕብረቁምፊ ዘዴ ግብይትን ወደ JSON ሕብረቁምፊ ይቀይራል።
የ FromJSON(ዳታ []ባይት) የስህተት ዘዴ እንደ ባይት ቁራጭ ከተላለፈው የJSON ቅርጸት ግብይትን ይጭናል።
የቼክ() ቡል ዘዴ ከግብይቱ ሃሽ መስክ የተገኘውን ሃሽ ይህን ግብይት በመጥረግ (የሃሽ መስኩን ችላ በማለት) ከተገኘው ሃሽ ጋር ያወዳድራል።
ግብይቶች ወደ እገዳው ታክለዋል፡-
የማገጃው ውሂብ መዋቅር የበለጠ ሰፊ ነው፡-
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 የመርክል ዛፍ ሥር ነው።
በሜዳዎች ውስጥ የእገዳው ፈጣሪ የህዝብ ቁልፍ ፣ የፈጣሪው ፊርማ ፣ የማገጃው እትም ፣ በብሎክ ውስጥ ያሉ የግብይቶች ብዛት እና እነዚህ ግብይቶች እራሳቸው አሉ።
ዘዴዎቹን እንመልከት፡-
ብሎክ ለመፍጠር የማገጃውን ይጠቀሙ።NewBlock() ተግባር፡ NewBlock(prevBlockHash string, height int) *ብሎክ፣የቀደመው ብሎክ ሃሽ የሚወስድ እና በብሎክቼይን ውስጥ ለተፈጠረው ብሎክ የተቀመጠው ቁመት። የማገጃው አይነት እንዲሁ ከሚከተሉት የጥቅል ቋሚ ዓይነቶች ተዘጋጅቷል፡-
b.DataType = types.BLOCK_TYPE.
የAddTx(tx *transaction.TX) ዘዴ ወደ እገዳ ግብይትን ይጨምራል።
የBuild() ዘዴ እሴቶችን ወደ ብሎክ መስኮች ይጭናል እና የአሁኑን ሃሽ ያመነጫል።
የ ToBytesHeader () [] ባይት ዘዴ የማገጃውን ርዕስ (ያለ ግብይቶች) ወደ ባይት ቁራጭ ይለውጠዋል።
የToJSON() ሕብረቁምፊ ዘዴ ማገጃውን ወደ JSON ቅርጸት በውሂቡ የሕብረቁምፊ ውክልና ይለውጠዋል።
የ FromJSON(ዳታ []ባይት) የስህተት ዘዴ ከJSON ወደ የማገጃ መዋቅር ይጭናል።
የቼክ() ቡል ዘዴ የማገጃ ሃሽ ያመነጫል እና በብሎክ ሃሽ መስክ ላይ ከተገለጸው ጋር ያወዳድራል።
የGetTxsHash() ሕብረቁምፊ ዘዴ በብሎክ ውስጥ ያሉትን ሁሉንም ግብይቶች ጠቅላላ ሃሽ ይመልሳል።
GetMerkleRoot() ዘዴ በብሎክ ውስጥ ለሚደረጉ ግብይቶች የመርክል ዛፍን ሥር ይገልጻል።
የምልክት(privk string) ዘዴ በብሎክ ፈጣሪ የግል ቁልፍ ይፈርማል።
የ SetHeight(ቁመት int) ዘዴ የማገጃውን ቁመት ወደ የማገጃ መዋቅር መስክ ይጽፋል።
የ GetHeight() int ዘዴ የማገጃውን መዋቅር በተዛመደ መስክ ላይ በተገለፀው መሰረት የእገዳውን ቁመት ይመልሳል።
የToGOBBytes() [] ባይት ዘዴ በGOB ቅርጸት ብሎክን ያስገባ እና እንደ ባይት ቁራጭ ይመልሰዋል።
የ FromGOBBytes(ዳታ []ባይት) የስህተት ዘዴ በGOB ቅርጸት ካለፈው ባይት ቁራጭ ላይ የማገድ መረጃን ወደ እገዳው መዋቅር ይጽፋል።
የጌትሃሽ() ሕብረቁምፊ ዘዴ የተሰጠውን ብሎክ ሃሽ ይመልሳል።
የ GetPrevHash() ሕብረቁምፊ ዘዴ የቀደመውን ብሎክ ሃሽ ይመልሳል።
SetPublicKey(pubk string) ዘዴ የማገጃ ፈጣሪውን ይፋዊ ቁልፍ ወደ ብሎክ ይጽፋል።
ስለዚህ የብሎክ ነገርን ዘዴዎችን በመጠቀም በቀላሉ በኔትወርኩ ላይ ለማስተላለፍ እና ወደ LevelDB የውሂብ ጎታ ለመቆጠብ ወደ ቅርጸት መለወጥ እንችላለን።
የብሎክቼይን ጥቅል ተግባራት ወደ 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(ቁመት int) የስህተት ተግባር በBLOCK_HEIGHT ቋሚ ከተገለጸው ቁልፍ ጋር የመስቀለኛ መንገድ የብሎክቼይን ቁመት ያለውን ዋጋ ወደ ዳታቤዝ ይጽፋል።
የ GetTargetBlockHeight() (int, error) ተግባር በመረጃ ቋቱ ውስጥ የተከማቸውን ለተወሰነ መስቀለኛ መንገድ የብሎክቼይን ቁመት ይመልሳል።
የCheckBlock(IBlock IBlock) ቡል ተግባር ይህንን ብሎክ ወደ blockchain ከማከልዎ በፊት ትክክለኛነትን ያረጋግጣል።
የአድብሎክ(IBlockን አግድ) ስህተት ተግባር በብሎክቼይን ላይ እገዳን ይጨምራል።
ብሎኮችን የማውጣት እና የማየት ተግባራት በብሎክቼይን ጥቅል የ explore.go ፋይል ውስጥ ይገኛሉ፡-
የ GetBlockByHash(hash string) (*ብሎክ.ብሎክ፣ስህተት) ተግባር ባዶ ብሎክ ነገርን ይፈጥራል፣ ከውሂቡ ውስጥ ብሎክን ጫነበት፣ ሃሽው ወደ እሱ ተላልፏል እና ጠቋሚ ወደ እሱ ይመልሳል።
የጄኔሲስ እገዳን መፍጠር የሚከናወነው በብሎክቼይን ጥቅል ከ genesis.go ፋይል በዘፍጥረት () ስህተት ተግባር ነው።
የሚቀጥለው መጣጥፍ ደንበኞችን በዌብሶኬት ዘዴ በመጠቀም ወደ መስቀለኛ መንገድ ስለማገናኘት ይናገራል።
ምንጭ: hab.com