எனது Go பிளாக்செயினில் தொகுதிகள் மற்றும் பரிவர்த்தனைகளை எப்படி வடிவமைத்தேன்

இறுதியில் ஒரு பிளாக்செயினுடன் முடிவடைவதற்கு ஒரு தரவுத்தளத்தை மட்டுமல்ல, எங்கள் திட்டத்தில் 3 முக்கியமான கூறுகளைச் சேர்க்க வேண்டும்:

  • தொகுதி தரவு அமைப்பு மற்றும் முறைகளின் விளக்கம்
  • தரவு கட்டமைப்பு மற்றும் பரிவர்த்தனை முறைகள் பற்றிய விளக்கம்
  • ஒரு தரவுத்தளத்தில் தொகுதிகளைச் சேமித்து, அவற்றின் ஹாஷ் அல்லது உயரம் (அல்லது வேறு ஏதாவது) மூலம் அவற்றைக் கண்டறியும் பிளாக்செயின் செயல்பாடுகள்.

எனது Go பிளாக்செயினில் தொகுதிகள் மற்றும் பரிவர்த்தனைகளை எப்படி வடிவமைத்தேன்

தொழில்துறைக்கான பிளாக்செயின் பற்றிய இரண்டாவது கட்டுரை இது, முதலாவது இங்கே.

இந்தத் தொடரின் முந்தைய கட்டுரையைப் பற்றி வாசகர்கள் என்னிடம் கேட்ட கேள்விகளை நினைவில் வைத்துக் கொள்ள வேண்டும்: இந்த விஷயத்தில், பிளாக்செயின் தரவைச் சேமிக்க 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, error) முறையானது பரிவர்த்தனைக்கு உள்ளீட்டைச் சேர்க்கிறது.

AddTxOut(value int, data []byte) (*TxOut, error) முறையானது பரிவர்த்தனைக்கு ஒரு வெளியீட்டைச் சேர்க்கிறது.

ToBytes() []byte முறையானது பரிவர்த்தனையை பைட் ஸ்லைஸாக மாற்றுகிறது.

உருவாக்கப்பட்ட பரிவர்த்தனை ஹாஷை JavaScript பயன்பாடுகளிலிருந்து உருவாக்கப்படும் பரிவர்த்தனை ஹாஷ்களுடன் இணக்கமாக மாற்ற, Build() மற்றும் Check() ஆகியவற்றில் உள்ள preByteHash(bytes []byte) சரம் பயன்படுத்தப்படுகிறது.

Build() முறையானது பரிவர்த்தனை ஹாஷை பின்வருமாறு அமைக்கிறது: tx.TxHash = preByteHash(tx.ToBytes()).

ToJSON() சரம் முறையானது ஒரு பரிவர்த்தனையை JSON சரமாக மாற்றுகிறது.

FromJSON(data []byte) பிழை முறையானது, பைட் ஸ்லைஸாக அனுப்பப்பட்ட 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 என்பது Merkle மரத்தின் வேர்.

மேலும் புலங்களில் தொகுதியை உருவாக்கியவரின் பொது விசை, உருவாக்கியவரின் கையொப்பம், தொகுதியின் பதிப்பு, தொகுதியில் உள்ள பரிவர்த்தனைகளின் எண்ணிக்கை மற்றும் இந்த பரிவர்த்தனைகள் உள்ளன.

அதன் முறைகளைப் பார்ப்போம்:
ஒரு தொகுதியை உருவாக்க, block.NewBlock() செயல்பாட்டைப் பயன்படுத்தவும்: NewBlock(prevBlockHash சரம், உயரம் int) *பிளாக், இது முந்தைய பிளாக்கின் ஹாஷ் மற்றும் பிளாக்செயினில் உருவாக்கப்பட்ட பிளாக்கிற்கான உயரத்தை எடுக்கும். தொகுதி வகையும் வகைகளின் தொகுப்பு மாறிலியிலிருந்து அமைக்கப்பட்டுள்ளது:

b.DataType = types.BLOCK_TYPE.

AddTx(tx *transaction.TX) முறையானது ஒரு தொகுதிக்கு பரிவர்த்தனையைச் சேர்க்கிறது.

பில்ட்() முறையானது தொகுதியின் புலங்களில் மதிப்புகளை ஏற்றுகிறது மற்றும் அதன் தற்போதைய ஹாஷை உருவாக்கி அமைக்கிறது.

ToBytesHeader() []byte முறையானது தொகுதி தலைப்பை (பரிவர்த்தனைகள் இல்லாமல்) பைட் ஸ்லைஸாக மாற்றுகிறது.

ToJSON() சரம் முறையானது, தரவின் சரம் பிரதிநிதித்துவத்தில் தொகுதியை JSON வடிவத்திற்கு மாற்றுகிறது.

FromJSON(data []byte) பிழை முறை JSON இலிருந்து தரவை ஒரு தொகுதி அமைப்பில் ஏற்றுகிறது.

செக்() பூல் முறையானது ஒரு பிளாக் ஹாஷை உருவாக்குகிறது மற்றும் பிளாக் ஹாஷ் புலத்தில் குறிப்பிடப்பட்டுள்ளதை ஒப்பிடுகிறது.

GetTxsHash() ஸ்ட்ரிங் முறையானது பிளாக்கில் உள்ள அனைத்து பரிவர்த்தனைகளின் மொத்த ஹாஷையும் வழங்குகிறது.

GetMerkleRoot() முறையானது ஒரு தொகுதியில் பரிவர்த்தனைகளுக்கு Merkle மரத்தின் வேரைக் குறிப்பிடுகிறது.

Sign(privk string) முறையானது, பிளாக் கிரியேட்டரின் தனிப்பட்ட விசையுடன் ஒரு தொகுதியை கையொப்பமிடுகிறது.

SetHeight(height int) முறையானது தொகுதியின் உயரத்தை தொகுதி கட்டமைப்பு புலத்திற்கு எழுதுகிறது.

GetHeight() int முறையானது பிளாக் கட்டமைப்பின் தொடர்புடைய புலத்தில் குறிப்பிடப்பட்டுள்ளபடி தொகுதியின் உயரத்தை வழங்குகிறது.

ToGOBBytes() []byte முறையானது GOB வடிவத்தில் ஒரு தொகுதியை குறியாக்கி பைட் ஸ்லைஸாக வழங்குகிறது.

FromGOBBytes(data []byte) பிழை முறையானது GOB வடிவத்தில் அனுப்பப்பட்ட பைட் ஸ்லைஸில் இருந்து தொகுதி கட்டமைப்பிற்கு தொகுதி தரவை எழுதுகிறது.

GetHash() சரம் முறை கொடுக்கப்பட்ட தொகுதியின் ஹாஷை வழங்குகிறது.

GetPrevHash() சரம் முறை முந்தைய தொகுதியின் ஹாஷை வழங்குகிறது.

SetPublicKey(pubk string) முறையானது தொகுதி உருவாக்கியவரின் பொது விசையை தொகுதிக்கு எழுதுகிறது.

எனவே, பிளாக் பொருளின் முறைகளைப் பயன்படுத்தி, பிணையத்தில் பரிமாற்றம் மற்றும் LevelDB தரவுத்தளத்தில் சேமிப்பதற்கான வடிவமைப்பை எளிதாக மாற்றலாம்.

பிளாக்செயினில் சேமிப்பதற்கு பிளாக்செயின் தொகுப்பின் செயல்பாடுகள் பொறுப்பு: 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(block IBlock) bool செயல்பாடு பிளாக்செயினில் இந்தத் தொகுதியைச் சேர்ப்பதற்கு முன் ஒரு பிளாக் சரியானதா எனச் சரிபார்க்கிறது.

AddBlock(block IBlock) பிழைச் செயல்பாடு பிளாக்செயினில் ஒரு தொகுதியைச் சேர்க்கிறது.

தொகுதிகளை மீட்டெடுப்பதற்கும் பார்ப்பதற்குமான செயல்பாடுகள் blockchain தொகுப்பின் explore.go கோப்பில் உள்ளன:

GetBlockByHash(hash string) (*block.Block, error) செயல்பாடு ஒரு வெற்று தொகுதி பொருளை உருவாக்குகிறது, தரவுத்தளத்தில் இருந்து ஒரு தொகுதியை அதில் ஏற்றுகிறது, அதன் ஹாஷ் அதற்கு அனுப்பப்பட்டு, அதற்கு ஒரு சுட்டியை வழங்குகிறது.

பிளாக்செயின் தொகுப்பின் genesis.go கோப்பில் இருந்து ஜெனிசிஸ்() பிழை செயல்பாட்டின் மூலம் ஒரு ஜெனிசிஸ் பிளாக் உருவாக்கம் செய்யப்படுகிறது.

WebSocket பொறிமுறையைப் பயன்படுத்தி கிளையண்டுகளை ஒரு முனையுடன் இணைப்பது பற்றி அடுத்த கட்டுரை பேசும்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்