በMy Go Blockchain ላይ ብሎኮችን እና ግብይቶችን እንዴት እንደነደፍኩ።

በዳታቤዝ ብቻ ሳይሆን በመጨረሻ በብሎክቼይን ለመጨረስ፣ ወደ ፕሮጀክታችን 3 አስፈላጊ ነገሮችን ማከል አለብን።

  • የማገጃ ውሂብ መዋቅር እና ዘዴዎች መግለጫ
  • የውሂብ መዋቅር እና የግብይት ዘዴዎች መግለጫ
  • ብሎኮችን በመረጃ ቋት ውስጥ የሚያስቀምጡ እና በሃሽ ወይም በቁመታቸው (ወይም በሌላ ነገር) የሚያገኟቸው Blockchain ተግባራት።

በMy Go Blockchain ላይ ብሎኮችን እና ግብይቶችን እንዴት እንደነደፍኩ።

ይህ ስለ blockchain ለኢንዱስትሪ ሁለተኛው ጽሑፍ ነው, የመጀመሪያው እዚህ.

በዚህ ተከታታይ ውስጥ ስላለፈው ጽሑፍ አንባቢዎች የጠየቁኝን ጥያቄዎች በማስታወስ ልብ ሊባል የሚገባው ጉዳይ ነው-በዚህ ጉዳይ ላይ የLevelDB ዳታቤዝ የማገጃ ቼይን መረጃን ለማከማቸት ጥቅም ላይ ይውላል ፣ ግን ምንም ሌላ ማንኛውንም ነገር እንዳይጠቀሙ የሚከለክልዎት ነገር የለም ፣ 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 ውፅዓቶች የተወሰነ እሴት እና እንዲሁም ባይትኮድ ያከማቻሉ።

አሁን አንድ ግብይት በውሂቡ ላይ ምን አይነት እርምጃዎችን እንደሚፈጽም እንይ፣ ማለትም ዘዴዎቹን እንመልከት።

ግብይት ለመፍጠር፣ ግብይቱን ይጠቀሙ።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 ቅርጸት ግብይትን ይጭናል።

የቼክ() ቡል ዘዴ ከግብይቱ ሃሽ መስክ የተገኘውን ሃሽ ይህን ግብይት በመጥረግ (የሃሽ መስኩን ችላ በማለት) ከተገኘው ሃሽ ጋር ያወዳድራል።

ግብይቶች ወደ እገዳው ታክለዋል፡- 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 የመርክል ዛፍ ሥር ነው።

በሜዳዎች ውስጥ የእገዳው ፈጣሪ የህዝብ ቁልፍ ፣ የፈጣሪው ፊርማ ፣ የማገጃው እትም ፣ በብሎክ ውስጥ ያሉ የግብይቶች ብዛት እና እነዚህ ግብይቶች እራሳቸው አሉ።

ዘዴዎቹን እንመልከት፡-
ብሎክ ለመፍጠር የማገጃውን ይጠቀሙ።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 የመቆጠብ ሃላፊነት አለባቸው፡- 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(ቁመት int) የስህተት ተግባር በBLOCK_HEIGHT ቋሚ ከተገለጸው ቁልፍ ጋር የመስቀለኛ መንገድ የብሎክቼይን ቁመት ያለውን ዋጋ ወደ ዳታቤዝ ይጽፋል።

የ GetTargetBlockHeight() (int, error) ተግባር በመረጃ ቋቱ ውስጥ የተከማቸውን ለተወሰነ መስቀለኛ መንገድ የብሎክቼይን ቁመት ይመልሳል።

የCheckBlock(IBlock IBlock) ቡል ተግባር ይህንን ብሎክ ወደ blockchain ከማከልዎ በፊት ትክክለኛነትን ያረጋግጣል።

የአድብሎክ(IBlockን አግድ) ስህተት ተግባር በብሎክቼይን ላይ እገዳን ይጨምራል።

ብሎኮችን የማውጣት እና የማየት ተግባራት በብሎክቼይን ጥቅል የ explore.go ፋይል ውስጥ ይገኛሉ፡-

የ GetBlockByHash(hash string) (*ብሎክ.ብሎክ፣ስህተት) ተግባር ባዶ ብሎክ ነገርን ይፈጥራል፣ ከውሂቡ ውስጥ ብሎክን ጫነበት፣ ሃሽው ወደ እሱ ተላልፏል እና ጠቋሚ ወደ እሱ ይመልሳል።

የጄኔሲስ እገዳን መፍጠር የሚከናወነው በብሎክቼይን ጥቅል ከ genesis.go ፋይል በዘፍጥረት () ስህተት ተግባር ነው።

የሚቀጥለው መጣጥፍ ደንበኞችን በዌብሶኬት ዘዴ በመጠቀም ወደ መስቀለኛ መንገድ ስለማገናኘት ይናገራል።

ምንጭ: hab.com

አስተያየት ያክሉ