ืืื ืกืืจ ืฆื ืกืืฃ ืึทืจืืืฃ ืืื ืึท ืืืึทืงืืืืืืึทื ืืื ื ืื ื ืึธืจ ืึท ืืึทืืึทืืืืก, ืืืจ ืืึทืจืคึฟื ืฆื ืืืืื 3 ืืืืืืืง ืขืืขืืขื ืื ืฆื ืืื ืืืขืจ ืคึผืจืืืขืงื:
- ืืึทืฉืจืืึทืืื ื ืคืื ืื ืืืึธืง ืืึทืื ืกืืจืืงืืืจ ืืื ืืขืืืึธืืก
- ืืึทืฉืจืืึทืืื ื ืคืื ืืึทืื ืกืืจืืงืืืจ ืืื ืืจืึทื ืกืึทืงืืืึธื ืืขืืืึธืืก
- ืืืึธืงืืฉืืื ืคืึทื ืืงืฉืึทื ื ืืืึธืก ืจืึทืืขืืืขื ืืืึทืงืก ืืื ืึท ืืึทืืึทืืืืก ืืื ืืขืคึฟืื ืขื ืืื ืืึธืจื ืืืจื ืืืืขืจ ืืึทืฉ ืึธืืขืจ ืืืื (ืึธืืขืจ ืขืคึผืขืก ืึทื ืืขืจืฉ).
ืืึธืก ืืื ืืขืจ ืฆืืืืืืขืจ ืึทืจืืืงื ืืืขืื ืืืึทืงืืืืืืึทื ืคึฟืึทืจ ืืื ืืืกืืจืืข, ืืขืจ ืขืจืฉืืขืจ
ืืขืืขื ืงื ืื ืคึฟืจืืื ืืืึธืก ืืืืขื ืขืจ ืืืจ ืืขืคืจืขืื ืืืขืื ืืขื ืคืจืืขืจืืืงื ืึทืจืืืงื ืืื ืืขื ืกืขืจืืข, ืขืก ืืึธื ืืืื ืื ืืขืืืืื: ืืื ืืขื ืคืึทื, ืื ืืขืืืขืืื ืืึทืืึทืืืืก ืืื ืืขื ืืฆื ืฆื ืงืจืึธื ืืืึทืงืืืืืืึทื ืืึทืื, ืึธืืขืจ ืืึธืจื ืืฉื ืคึผืจืืืืขื ืฅ ืืืจ ืคืื ื ืืฆื ืงืืื ืื ืืขืจืข, ืืืฉื, 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), ืื ืืึทืฉ ืคืื ืื ืืจืึทื ืกืึทืงืืืึธื, ืื ืืืคึผ ืคืื ืื ืืจืึทื ืกืึทืงืืืึธื ืืื, ืึท ืืืืขืกืืึทืืคึผ ืืื ืื ืคึผืืฅ ืืื ืึทืืืคึผืืฅ. ืืงืกืื ืื ืคึผืืฅ ืงืจืึธื ืื ืืึทืฉ ืคืื ืื ืืจืึทื ืกืึทืงืืืึธื ืืืขืืขื ืก ืจืขืืืืืึทื ืืื ืจืขืคืขืจืจืขื, ืื ื ืืืขืจ ืคืื ืืขื ืจืขืืืืืึทื ืืื ืืืืขืงืึธืืข, ืืื TxOut ืึทืืืคึผืืฅ ืงืจืึธื ืขืืืขืืข ืืืขืจื ืืื ืืืื ืืืืขืงืึธืืข.
ืืืฆื ืืึธืื ืก ืืขื ืืืึธืก ืึทืงืฉืึทื ื ืึท ืืจืึทื ืกืึทืงืืืึธื ืงืขื ืขื ืืืจืืคืืจื ืืืืฃ ืืืึทื ืืึทืื, ื.ืข. ืืื ืก ืงืืง ืืื ืื ืืขืืืึธืืก.
ืฆื ืฉืึทืคึฟื ืึท ืืจืึทื ืกืึทืงืืืึธื, ื ืืฆื ืื ืืจืึทื ืกืึทืงืืืึธื. ื ืขืืืืจืึทื ืกืึทืงืืืึธื (ืืงืกืืืคึผืข ืืืื) * ืืงืก ืคึฟืื ืงืฆืืข.
ืื AddTxIn (thattxhash [] ืืืื, txoutn int, ืงืึธื [] ืืืื) (* TxIn, ืืขืืช) ืืืคึฟื ืืืกืืฃ ืึทื ืึทืจืืึทื ืฉืจืืึทื ืฆื ืื ืืจืึทื ืกืึทืงืืืึธื.
ืื AddTxOut (ืืืขืจื ืื ื, ืืึทืื [] ืืืื) (* TxOut, ืืขืืช) ืืืคึฟื ืืืกืืฃ ืึท ืจืขืืืืืึทื ืฆื ืื ืืจืึทื ืกืึทืงืืืึธื.
ืื ToBytes () [] ืืืื ืืืคึฟื ืืืจื ืก ืื ืืจืึทื ืกืึทืงืืืึธื ืืื ืึท ืืืื ืจืขืคืื.
ืื ืื ืขืจืืขื ืคึฟืื ืงืฆืืข preByteHash (ืืืืขืก [] ืืืื) ืฉืืจืืงื ืืื ืืขื ืืฆื ืืื Build () ืืื ืงืืง () ืฆื ืืึทืื ืื ืืืฉืขื ืขืจืืืืึทื ืืจืึทื ืกืึทืงืืืึธื ืืึทืฉ ืงืึทืืคึผืึทืืึทืืึทื ืืื ืืจืึทื ืกืึทืงืืืึธื ืืึทืฉืขืก ืืืฉืขื ืขืจืืืืึทื ืคึฟืื ืืืฉืึทืืืึทืกืงืจืืคึผื ืึทืคึผืืึทืงืืืฉืึทื ื.
ืื 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 ืืื ืืขืจ ืืืึธืจืฆื ืคืื ืื ืืขืจืงืืข ืืืื.
ืืืืึทืืขืจ ืืื ืื ืคืขืืืขืจ ืขืก ืืื ืืขืจ ืฆืืืืจ ืฉืืืกื ืคืื ืืขืจ ืืืฉืขืคืขืจ ืคืื ืื ืืืึธืง, ืื ืืกืืืข ืคืื โโืื ืืืฉืขืคืขืจ, ืื ืืืขืจืกืืข ืคืื โโืื ืืืึธืง, ืื ื ืืืขืจ ืคืื ืืจืึทื ืืึทืงืฉืึทื ื ืืื ืื ืืืึธืง, ืืื ืื ืืจืึทื ืืึทืงืฉืึทื ื ืืื.
ืืื ืก ืงืืง ืืื ืืืึทื ืืขืืืึธืืก:
ืฆื ืฉืึทืคึฟื ืึท ืืืึธืง, ื ืืฆื ืื block.NewBlock() ืคึฟืื ืงืฆืืข: NewBlock(prevBlockHash string, height int) *Block, ืืืึธืก ื ืขืื ืื ืืึทืฉ ืคืื ืื ืคืจืืขืจืืืงืข ืืืึธืง ืืื ืื ืืืื ืฉืืขืื ืคึฟืึทืจ ืื ืืืฉืืคื ืืืึธืง ืืื ืื ืืืึธืงืืฉืืื. ืื ืืืึธืง ืืืคึผ ืืื ืืืื ืืึทืฉืืืื ืคึฟืื ืื ืืืคึผ ืคึผืขืงื ืงืขืกืืืืขืจืืืง:
b.DataType = types.BLOCK_TYPE.
ืื AddTx(tx *transaction.TX) ืืืคึฟื ืืืกืืฃ ืึท ืืจืึทื ืกืึทืงืืืึธื ืฆื ืึท ืืืึธืง.
ืื Build () ืืืคึฟื ืืึธืืื ืืืึทืืืขืก ืืื ืื ืคืขืืืขืจ ืคืื ืื ืืืึธืง ืืื ืืืฉืขื ืขืจืืืฅ ืืื ืฉืืขืื ืืืื ืงืจืึทื ื ืืึทืฉ.
ืื ToBytesHeader () [] ืืืื ืืืคึฟื ืงืึทื ืืืขืจืฅ ืื ืืืึธืง ืืขืืขืจ (ืึธื ืืจืึทื ืืึทืงืฉืึทื ื) ืืื ืึท ืืืื ืจืขืคืื.
ืื ToJSON () ืฉืืจืืงื ืืืคึฟื ืงืึทื ืืืขืจืฅ ืื ืืืึธืง ืฆื JSON ืคึฟืึธืจืืึทื ืืื ืึท ืฉืืจืืงื ืคืึทืจืืจืขืืื ื ืคืื ืื ืืึทืื.
ืื FromJSON (ืืึทืืึท [] ืืืื) ืืขืืช ืืืคึฟื ืืึธืืื ืืึทืื ืคืื JSON ืืื ืึท ืืืึธืง ืกืืจืืงืืืจ.
ืื ืืฉืขืง () ืืื ืืขืืึธื ืืืฉืขื ืขืจืืืฅ ืึท ืืืึธืง ืืึทืฉ ืืื ืงืึทืืคึผืขืจื ืขืก ืืื ืื ืกืคึผืขืกืืคืืขื ืืื ืื ืืืึธืง ืืึทืฉ ืคืขืื.
ืื GetTxsHash () ืฉืืจืืงื ืืืคึฟื ืงืขืจื ืื ืืึทื ืฅ ืืึทืฉ ืคืื ืึทืืข ืืจืึทื ืืึทืงืฉืึทื ื ืืื ืืขื ืืืึธืง.
ืื GetMerkleRoot () ืืืคึฟื ืกืคึผืขืฆืืคืืฆืืจื ืื ืืืึธืจืฆื ืคืื ืื Merkle ืืืื ืคึฟืึทืจ ืืจืึทื ืืึทืงืฉืึทื ื ืืื ืึท ืืืึธืง.
ืื Sign (privk string) ืืขืืึทื ืกืืื ืึทืื ืึท ืืืึธืง ืืื ืื ืคึผืจืืืืึทื ืฉืืืกื ืคืื ืื ืืืึธืง ืืืฉืขืคืขืจ.
ืื SetHeight (ืืืื ืื ื) ืืืคึฟื ืฉืจืืืื ืื ืืืื ืคืื ืื ืืืึธืง ืฆื ืื ืืืึธืง ืกืืจืืงืืืจ ืคืขืื.
ืืขืจ GetHeight () int ืืขืืึธื ืงืขืจื ืื ืืืื ืคืื ืื ืืืึธืง ืืื ืกืคึผืขืกืืคืืขื ืืื ืื ืงืึธืจืึทืกืคึผืึทื ืืื ื ืคืขืื ืคืื ืื ืืืึธืง ืกืืจืืงืืืจ.
ืื ToGOBBytes () [] ืืืื ืืืคึฟื ืงืึธืืขืงืก ืึท ืืืึธืง ืืื GOB ืคึฟืึธืจืืึทื ืืื ืงืขืจื ืขืก ืืื ืึท ืืืื ืจืขืคืื.
ืื FromGOBBytes (data [] byte) ืืขืืช ืืืคึฟื ืฉืจืืืื ืืืึธืง ืืึทืื ืฆื ืื ืืืึธืง ืกืืจืืงืืืจ ืคึฟืื ืื ืืืจืืืขืืื ืืขื ืืืื ืจืขืคืื ืืื GOB ืคึฟืึธืจืืึทื.
ืื GetHash () ืฉืืจืืงื ืืขืืึทื ืงืขืจื ืื ืืึทืฉ ืคืื ืื ืืขืืขืื ืืืึธืง.
ืื GetPrevHash () ืฉืืจืืงื ืืืคึฟื ืงืขืจื ืื ืืึทืฉ ืคืื ืื ืคืจืืขืจืืืงืข ืืืึธืง.
ืื SetPublicKey (pubk string) ืืขืืึทื ืฉืจืืืื ืืขื ืฆืืืืจ ืฉืืืกื ืคืื ืื ืืืึธืง ืืืฉืขืคืขืจ ืฆื ืื ืืืึธืง.
ืืืื, ืืื ืื ืืขืืืึธืืก ืคืื ืื ืืืึทืง ืืืืคืขืฅ, ืืืจ ืงืขื ืขื ืืืืื ืืขืจ ืขืก ืืื ืึท ืคึฟืึธืจืืึทื ืคึฟืึทืจ ืืจืึทื ืกืืืกืืข ืืืืขืจ ืื ื ืขืฅ ืืื ืฉืคึผืึธืจื ืฆื ืื ืืขืืืขืืื ืืึทืืึทืืืืก.
ืื ืคืึทื ืืงืฉืึทื ื ืคืื ืื ืืืึทืงืืืื ืคึผืขืงื ืืขื ืขื ืคืึทืจืึทื ืืืืึธืจืืืขื ืคึฟืึทืจ ืฉืคึผืึธืจื ืฆื ืื ืืืึทืงืืืื:
ืฆื ืืึธื ืืึธืก, ืืขืจ ืืืึธืง ืืืื ืื ืกืืจืืืขื ื ืื 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 (ืืึทืฉ ืฉืืจืืงื) ืืขืืช ืคึฟืื ืงืฆืืข ืฉืจืืืื ืื ืืึทืฉ ืคืื ืืขื ืงืจืึทื ื ืืืึธืง ืืื ืื ืฉืืืกื ืกืคึผืขืกืืคืืขื ืืืจื ืื BLOCK_HASH ืงืขืกืืืืขืจืืืง ืฆื ืื ืืึทืืึทืืืืก.
ืื GetTargetBlockHash () (ืฉืืจืืงื, ืืขืืช) ืคึฟืื ืงืฆืืข ืงืขืจื ืื ืืึทืฉ ืคืื ืืขื ืงืจืึทื ื ืืืึธืง ืกืืึธืจื ืืื ืื ืืึทืืึทืืืืก.
ืื SetTargetBlockHeight (ืืืื ืื ื) ืืขืืช ืคึฟืื ืงืฆืืข ืฉืจืืืื ืฆื ืื ืืึทืืึทืืืืก ืื ืืืขืจื ืคืื ืื ืืืึทืงืืืืืืึทื ืืืื ืคึฟืึทืจ ืื ื ืึธืืข ืืื ืื ืฉืืืกื ืกืคึผืขืกืืคืืขื ืืืจื ืื BLOCK_HEIGHT ืงืขืกืืืืขืจืืืง.
ืื GetTargetBlockHeight () (ืื ื, ืืขืืช) ืคึฟืื ืงืฆืืข ืงืขืจื ืื ืืืื ืคืื ืื ืืืึทืงืืืืืืึทื ืคึฟืึทืจ ืึท ืืขืืขืื ื ืึธืืข, ืกืืึธืจื ืืื ืื ืืึทืืึทืืืืก.
ืื CheckBlock (ืืืึธืง IBlock) ืืื ืคืื ืงืฆืืข ืืฉืขืงืก ืึท ืืืึธืง ืคึฟืึทืจ ืงืขืจืขืงืื ืึทืก ืืืืืขืจ ืึทืืื ื ืืขื ืืืึธืง ืฆื ืื ืืืึธืงืืฉืืื.
ืื AddBlock (ืืืึธืง IBlock) ืืขืืช ืคึฟืื ืงืฆืืข ืืืกืืฃ ืึท ืืืึธืง ืฆื ืื ืืืึธืงืืฉืืื.
ืื ืคืึทื ืืงืฉืึทื ื ืคึฟืึทืจ ืจืืืจืืืืื ื ืืื ืืืืืื ื ืืืึทืงืก ืืขื ืขื ืืื ืื explore.go ืืขืงืข ืคืื โโืื ืืืึทืงืืืืืืึทื ืคึผืขืงื:
ืื GetBlockByHash (ืืึทืฉ ืฉืืจืืงื) (*block.Block, ืืขืืช) ืคึฟืื ืงืฆืืข ืงืจืืืืฅ ืึท ืืืืืืง ืืืึธืง ืืืืคืขืฅ, ืืึธืืื ืึท ืืืึธืง ืืื ืขืก ืคึฟืื ืื ืืึทืืึทืืืืก, ืื ืืึทืฉ ืคืื ืืืึธืก ืืื ืืขืืืขื ืืืจืืืขืืื ืืขื ืฆื ืืื, ืืื ืงืขืจื ืึท ืืืึทืื ืฆื ืขืก.
ืื ืฉืึทืคืื ื ืคืื ืึท ืืขื ืขืกืืก ืืืึธืง ืืื ืืืจืืืขืงืึธืื ืืืจื ืื ืืขื ืขืกืืก () ืืขืืช ืคึฟืื ืงืฆืืข ืคืื โโืื ืืขื ืขืกืืก.ืืึธ ืืขืงืข ืคืื โโืื ืืืึทืงืืืืืืึทื ืคึผืขืงื.
ืืขืจ ืืืืึทืืขืจ ืึทืจืืืงื ืืืขื ืจืขืื ืืืขืื ืงืึทื ืขืงืืื ื ืงืืืืึทื ืฅ ืฆื ืึท ื ืึธืืข ื ืืฆื ืื WebSocket ืืขืงืึทื ืืืึทื.
ืืงืืจ: www.habr.com