áá±áá¬áá±á·á áºáá áºáá¯áá¬áá blockchain áá áºáá¯ááŸáá·áºá¡áá¯á¶ážáááºáááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºááœáẠá¡áá±ážááŒá®ážáá±á¬ááŒááºá áẠ3 áá¯ááᯠááá·áºááœááºážáááºááá¯á¡ááºáááº-
- ááá±á¬ááºáá±áá¬áááºáá±á¬ááºáá¯á¶ááŸáá·áº áááºážáááºážáá»á¬ážááᯠáá±á¬áºááŒáá»ááº
- áá±áá¬ááœá²á·á ááºážáá¯á¶ááŸáá·áº ááœá±áá±ážááœá±áá°áááºážáááºážáá»á¬ážá áá±á¬áºááŒáá»ááº
- áá±áá¬áá±á·á áºáá áºáá¯ááœáẠááá±á¬ááºáá»á¬ážááᯠááááºážáááºážááŒá®áž áááºážááá¯á·á hash ááá¯á·ááá¯áẠá¡ááŒáá·áº (ááá¯á·ááá¯áẠá¡ááŒá¬ážá¡áá¬áá áºáá¯áá¯) ááŒáá·áº áááºážááá¯á·ááᯠááá¯áá±áá¬ááœáẠááŸá¬ááœá±á·ááá·áº Blockchain áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá
á€áááºááŸá¬á
ááºááŸá¯áá¯ááºáááºážá¡ááœáẠblockchain ááŸáá·áºáááºáááºáá±á¬áá¯ááááá±á¬ááºážáá«ážááŒá
áºáááºá ááá
á€á á®ážáá®ážááŸáááááºáá±á¬ááºážáá«ážááŸáá·áº áááºáááºá á á¬áááºáá°áá»á¬ážáá±ážáá²á·áá±á¬áá±ážááœááºážáá»á¬ážááᯠááŸááºáá¬ážáá¬ážááá·áºáááº- á€ááá á¹á ááœááºá LevelDB áá±áá¬áá±á·á áºááᯠblockchain áá±áá¬ááᯠááááºážáááºážááẠá¡áá¯á¶ážááŒá¯áá±á¬áºáááºáž áááºááá·áºá¡áá¬áá០ááá·áºá¡á¬áž 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 á¡ááœááº)á ááá¯ááœá±áá±ážááœá±áá°á 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 ááŸáá·áº ááŸáá¯ááºážááŸááºáá«áááºá
ááœá±áá±ážááœá±áá°áá»á¬ážááᯠááá±á¬ááºááá¯á· áá±á«ááºážááá·áºáááº-
ááá±á¬ááºáá±áá¬ááœá²á·á ááºážáá¯á¶ááẠááá¯ááá¯áá±á¬ááºááááº-
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 ááá¯á·ááááºážáááºážáááºá¡ááœááºáá¬áááºááŸááááºá
áá«ááá¯áá¯ááºááá¯á·á 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