เบ‚เป‰เบญเบเบญเบญเบเปเบšเบšเบšเบฅเบฑเบญเบเปเบฅเบฐเบ—เบธเบฅเบฐเบเปเบฒเปƒเบ™ Go blockchain เบ‚เบญเบ‡เบ‚เป‰เบญเบเป„เบ”เป‰เปเบ™เบงเปƒเบ”

เปƒเบ™เบ—เบตเปˆเบชเบธเบ”เป€เบžเบทเปˆเบญเบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบ blockchain เปเบฅเบฐเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบก 3 เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

  • เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบšเบฅเบฑเบญเบเปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™
  • เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™ เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ
  • เบŸเบฑเบ‡เบŠเบฑเบ™ Blockchain เบ—เบตเปˆเบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เบ•เบฑเบ™เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบŠเบญเบเบซเบฒเบžเบงเบเบกเบฑเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™เบ”เป‰เบงเบ hash เบซเบผเบทเบ„เบงเบฒเบกเบชเบนเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ (เบซเบผเบทเบชเบดเปˆเบ‡เบญเบทเปˆเบ™).

เบ‚เป‰เบญเบเบญเบญเบเปเบšเบšเบšเบฅเบฑเบญเบเปเบฅเบฐเบ—เบธเบฅเบฐเบเปเบฒเปƒเบ™ 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 เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเปเบฒเบ™เบฑเป‰เบ™, เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเปเบฒเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, timestamp, เปเบฅเบฐ inputs เปเบฅเบฐ outputs. เบงเบฑเบ”เบชเบฐเบ”เบธเบ›เป‰เบญเบ™ TxIn เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ hash เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบœเบปเบ™เบœเบฐเบฅเบดเบ”เป„เบ”เป‰เบ–เบทเบเบญเป‰เบฒเบ‡เบญเบตเบ‡, เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ™เบตเป‰เปเบฅเบฐ bytecode, เปเบฅเบฐเบœเบปเบ™เบœเบฐเบฅเบดเบ” TxOut เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบšเบฒเบ‡เบกเบนเบ™เบ„เปˆเบฒเปเบฅเบฐ bytecode.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเปƒเบ”เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบกเบฑเบ™เป„เบ”เป‰, i.e. เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™.

เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ—เบธเบฅเบฐเบเปเบฒ, เปƒเบซเป‰เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ transaction.NewTransaction(txtype byte) *TX.

AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) เบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ.

เบงเบดเบ—เบตเบเบฒเบ™ AddTxOut(value int, data []byte) (*TxOut, error) เบˆเบฐเป€เบžเบตเปˆเบกเบœเบปเบ™เบœเบฐเบฅเบดเบ”เปƒเบซเป‰เบเบฑเบšเบ—เบธเบฅเบฐเบเปเบฒ.

เบงเบดเบ—เบตเบเบฒเบ™ ToBytes() []byte เบˆเบฐเบ›เปˆเบฝเบ™เบ—เบธเบฅเบฐเบเปเบฒเปƒเบซเป‰เป€เบ›เบฑเบ™ byte slice.

เบŸเบฑเบ‡เบŠเบฑเบ™เบžเบฒเบเปƒเบ™ preByteHash(bytes []byte) string เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™ Build() เปเบฅเบฐ Check() เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰ hash เบ—เบธเบฅเบฐเบเปเบฒเบ—เบตเปˆเบœเบฐเบฅเบดเบ”เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ hashes เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบˆเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ JavaScript.

เบงเบดเบ—เบตเบเบฒเบ™ Build() เบเปเบฒเบ™เบปเบ” hash เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเปเบฒเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: tx.TxHash = preByteHash(tx.ToBytes()).

เบงเบดเบ—เบตเบเบฒเบ™เบชเบฐเบ•เบฃเบดเบ‡ ToJSON() เบ›เปˆเบฝเบ™เบ—เบธเบฅเบฐเบเบณเป€เบ›เบฑเบ™เบชเบฐเบ•เบฃเบดเบ‡ JSON.

เบงเบดเบ—เบตเบเบฒเบ™เบœเบดเบ”เบžเบฒเบ” FromJSON(data []byte) เป‚เบซเบผเบ”เบ—เบธเบฅเบฐเบเปเบฒเบˆเบฒเบเบฎเบนเบšเปเบšเบš JSON เบœเปˆเบฒเบ™เป€เบ›เบฑเบ™ byte slice.

เบงเบดเบ—เบตเบเบฒเบ™ Check() bool เบ›เบฝเบšเบ—เบฝเบš hash เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบเบŠเปˆเบญเบ‡ hash เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเปเบฒเบเบฑเบš hash เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™ hashing เบ—เบธเบฅเบฐเบเปเบฒเบ™เบตเป‰ (เบšเปเปˆเบชเบปเบ™เปƒเบˆเบŠเปˆเบญเบ‡ 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 เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ„เบงเบฒเบกเบชเบนเบ‡เบ‚เบญเบ‡เบ•เบฑเบ™.
เบชเบฐเปเบ•เบกเป€เบงเบฅเบฒ.
HeaderSize เปเบกเปˆเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ•เบฑเบ™เปƒเบ™ bytes.
PrevBlockHash เปเบกเปˆเบ™ hash เบ‚เบญเบ‡เบ•เบฑเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เปเบฅเบฐ SelfBlockHash เปเบกเปˆเบ™ hash เบ‚เบญเบ‡เบ›เบฐเบˆเบธเบšเบฑเบ™.
TxsHash เป€เบ›เบฑเบ™ hash เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ.
MerkleRoot เปเบกเปˆเบ™เบฎเบฒเบเบ‚เบญเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰ Merkle.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เปƒเบ™เบ‚เบปเบ‡เป€เบ‚เบ”เบกเบตเบฅเบฐเบซเบฑเบ”เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ‚เบญเบ‡เบœเบนเป‰เบชเป‰เบฒเบ‡เบšเบฅเบฑเบญเบ, เบฅเบฒเบเป€เบŠเบฑเบ™เบ‚เบญเบ‡เบœเบนเป‰เบชเป‰เบฒเบ‡, เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡เบšเบฅเบฑเบญเบ, เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเปƒเบ™เบšเบฅเบฑเบญเบ, เปเบฅเบฐเบ—เบธเบฅเบฐเบเปเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบญเบ‡.

เปƒเบซเป‰โ€‹เป€เบšเบดเปˆเบ‡โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ•เบปเบ™โ€‹:
เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบšเบฅเบฑเบญเบ, เปƒเบซเป‰เปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ block.NewBlock(): NewBlock(prevBlockHash string, height int) *Block, เป€เบŠเบดเปˆเบ‡เปƒเบŠเป‰ hash เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบเปˆเบญเบ™เปœเป‰เบฒ เปเบฅเบฐเบฅเบฐเบ”เบฑเบšเบ„เบงเบฒเบกเบชเบนเบ‡เบ—เบตเปˆเบเบณเบ™เบปเบ”เป„เบงเป‰เบชเบณเบฅเบฑเบšเบšเบฅเบฑเบญเบเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ blockchain. เบ›เบฐเป€เบžเบ”เบšเบฅเบฑเบญเบเบเบฑเบ‡เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบˆเบฒเบเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบŠเบธเบ”เบ„เบปเบ‡เบ—เบตเปˆ:

b.DataType = types.BLOCK_TYPE.

เบงเบดเบ—เบตเบเบฒเบ™ AddTx(tx *transaction.TX) เป€เบžเบตเปˆเบกเบ—เบธเบฅเบฐเบเปเบฒเปƒเบชเปˆเบšเบฅเบฑเบญเบ.

เบงเบดเบ—เบตเบเบฒเบ™ Build() เป‚เบซเบผเบ”เบ„เปˆเบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเปเบฅเบฐเบชเป‰เบฒเบ‡เปเบฅเบฐเบเปเบฒเบ™เบปเบ” hash เบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบกเบฑเบ™.

เบงเบดเบ—เบตเบเบฒเบ™ ToBytesHeader() []byte เบˆเบฐเบ›เปˆเบฝเบ™เบชเปˆเบงเบ™เบซเบปเบงเบ‚เบญเบ‡เบšเบฅเบฑเบญเบ (เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒ) เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เปเบ–เบš byte.

เบงเบดเบ—เบตเบเบฒเบ™เบชเบฐเบ•เบฃเบดเบ‡ ToJSON() เบ›เปˆเบฝเบ™เบšเบฅเบฑเบญเบเป€เบ›เบฑเบ™เบฎเบนเบšเปเบšเบš JSON เปƒเบ™เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™.

เบงเบดเบ—เบตเบเบฒเบ™เบœเบดเบ”เบžเบฒเบ” FromJSON(data []byte) เป‚เบซเบผเบ”เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบ JSON เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบšเบฅเบฑเบญเบ.

เบงเบดเบ—เบตเบเบฒเบ™ Check() bool เบชเป‰เบฒเบ‡ block hash เปเบฅเบฐเบ›เบฝเบšเบ—เบฝเบšเบกเบฑเบ™เบเบฑเบšเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบŠเปˆเบญเบ‡ block hash.

เบงเบดเบ—เบตเบเบฒเบ™เบชเบฐเบ•เบฃเบดเบ‡ GetTxsHash() เบเบฑเบšเบ„เบทเบ™ hash เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบ—เบธเบฅเบฐเบเปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบšเบฅเบฑเบญเบ.

เบงเบดเบ—เบตเบเบฒเบ™ GetMerkleRoot() เบเปเบฒเบ™เบปเบ”เบฎเบฒเบเบ‚เบญเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰ Merkle เบชเปเบฒเบฅเบฑเบšเบ—เบธเบฅเบฐเบเปเบฒเปƒเบ™เบšเบฅเบฑเบญเบ.

เบงเบดเบ—เบตเบเบฒเบ™ Sign(privk string) เป€เบŠเบฑเบ™เบšเบฅเบฑเบญเบเบ”เป‰เบงเบเบเบฐเปเบˆเบชเปˆเบงเบ™เบ•เบปเบงเบ‚เบญเบ‡เบœเบนเป‰เบชเป‰เบฒเบ‡เบšเบฅเบฑเบญเบ.

เบงเบดเบ—เบตเบเบฒเบ™ SetHeight(height int) เบˆเบฐเบ‚เบฝเบ™เบ„เบงเบฒเบกเบชเบนเบ‡เบ‚เบญเบ‡เบšเบผเบฑเบญเบเปƒเบชเปˆเบžเบฒเบเบชเบฐเบซเบ™เบฒเบกเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบšเบฅเบฑเบญเบ.

เบงเบดเบ—เบตเบเบฒเบ™ GetHeight() int เบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เบงเบฒเบกเบชเบนเบ‡เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ•เบฒเบกเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบšเบฅเบฑเบญเบ.

เบงเบดเบ—เบตเบเบฒเบ™ ToGOBBytes() []byte เบˆเบฐเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบšเบฅเบฑเบญเบเปƒเบ™เบฎเบนเบšเปเบšเบš GOB เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบกเบฑเบ™เป€เบ›เบฑเบ™ byte slice.

เบงเบดเบ—เบตเบเบฒเบ™เบœเบดเบ”เบžเบฒเบ” FromGOBBytes(data []byte) เบ‚เบฝเบ™เบ‚เปเป‰เบกเบนเบ™เบšเบฅเบฑเบญเบเป„เบ›เบซเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบšเบฅเบฑเบญเบเบˆเบฒเบเปเบ–เบš byte เบœเปˆเบฒเบ™เปƒเบ™เบฎเบนเบšเปเบšเบš GOB.

เบงเบดเบ—เบตเบเบฒเบ™เบชเบฐเบ•เบฃเบดเบ‡ GetHash() เบเบฑเบšเบ„เบทเบ™ hash เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ—เบตเปˆเปƒเบซเป‰.

เบงเบดเบ—เบตเบเบฒเบ™เบชเบฐเบ•เบฃเบดเบ‡ GetPrevHash() เบเบฑเบšเบ„เบทเบ™ hash เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ.

เบงเบดเบ—เบตเบเบฒเบ™ SetPublicKey(pubk string) เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ‚เบญเบ‡เบœเบนเป‰เบชเป‰เบฒเบ‡เบšเบฅเบฑเบญเบเปƒเบชเปˆเบšเบฅเบฑเบญเบ.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡ Block object, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฎเบนเบšเปเบšเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบ›เบฐเบซเบเบฑเบ”เบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ LevelDB.

เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบŠเบธเบ” blockchain เปเบกเปˆเบ™เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบซเบเบฑเบ”เบเบฑเบš 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() เปเบกเปˆเบ™ wrapper เบชเปเบฒเบฅเบฑเบš db.Cloce() - เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบซเบผเบฑเบ‡เบˆเบฒเบเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบซเบธเป‰เบกเบซเปเปˆเป€เบžเบทเปˆเบญเบ›เบดเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เบŸเบฑเบ‡เบŠเบฑเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” SetTargetBlockHash(hash string) เบ‚เบฝเบ™ hash เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เป‚เบ”เบ BLOCK_HASH เบ„เบปเบ‡เบ—เบตเปˆเปƒเบชเปˆเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เบŸเบฑเบ‡เบŠเบฑเบ™ GetTargetBlockHash() (string, error) เบเบฑเบšเบ„เบทเบ™ hash เบ‚เบญเบ‡เบšเบฅเบฑเบญเบเบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เบŸเบฑเบ‡เบŠเบฑเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” SetTargetBlockHeight(height int) เบ‚เบฝเบ™เปƒเบชเปˆเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบ„เบงเบฒเบกเบชเบนเบ‡เบ‚เบญเบ‡ blockchain เบชเปเบฒเบฅเบฑเบš node เบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เป‚เบ”เบ BLOCK_HEIGHT เบ„เบปเบ‡เบ—เบตเปˆ.

เบŸเบฑเบ‡เบŠเบฑเบ™ GetTargetBlockHeight() (int, error) เบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เบงเบฒเบกเบชเบนเบ‡เบ‚เบญเบ‡ blockchain เบชเปเบฒเบฅเบฑเบš node เบ—เบตเปˆเปƒเบซเป‰, เป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เบŸเบฑเบ‡เบŠเบฑเบ™ CheckBlock(block IBlock) bool เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ•เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบกเบšเบฅเบฑเบญเบเบ™เบตเป‰เปƒเบชเปˆ blockchain.

เบŸเบฑเบ‡เบŠเบฑเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” AddBlock(block IBlock) เป€เบžเบตเปˆเบกเบ•เบฑเบ™เปƒเบซเป‰เบเบฑเบš blockchain.

เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบถเบ‡เปเบฅเบฐเป€เบšเบดเปˆเบ‡ blocks เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒ explore.go เบ‚เบญเบ‡เบŠเบธเบ” blockchain:

เบŸเบฑเบ‡เบŠเบฑเบ™ GetBlockByHash(hash string) (*block.Block, error) เบชเป‰เบฒเบ‡ object block เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เป‚เบซเบผเบ” block เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™เบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, hash เบ‚เบญเบ‡เบ—เบตเปˆเบชเบปเปˆเบ‡เป„เบ›เปƒเบซเป‰เบกเบฑเบ™, เปเบฅเบฐเบชเบปเปˆเบ‡ pointer เบเบฑเบšเบกเบฑเบ™.

เบเบฒเบ™เบชเป‰เบฒเบ‡ genesis block เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เป‚เบ”เบ Genesis () เบซเบ™เป‰เบฒเบ—เบตเปˆเบœเบดเบ”เบžเบฒเบ”เบˆเบฒเบเป„เบŸเบฅเปŒ genesis.go เบ‚เบญเบ‡เบŠเบธเบ” blockchain.

เบšเบปเบ”เบ„เบงเบฒเบกเบ•เปเปˆเป„เบ›เบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบฅเบนเบเบ„เป‰เบฒเบเบฑเบš node เป‚เบ”เบเปƒเบŠเป‰เบเบปเบ™เป„เบ WebSocket.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™