ืืื ืืกืืคื ืฉื ืืืจ ืืืืืข ืืืืืงืฆ'ืืื ืืื ืจืง ืืืกื ื ืชืื ืื, ืขืืื ื ืืืืกืืฃ 3 ืืืื ืืื ืืฉืืืื ืืคืจืืืงื ืฉืื ื:
- ืชืืืืจ ืืื ื ื ืชืื ื ืืืืืง ืืืฉืืืืช
- ืชืืืืจ ืืื ื ืื ืชืื ืื ืืฉืืืืช ืืขืกืงืืืช
- ืคืื ืงืฆืืืช ืืืืงืฆ'ืืื ืฉืฉืืืจืืช ืืืืงืื ืืืกื ื ืชืื ืื ืืืืฆืืืช ืืืชื ืฉื ืืคื ื-hash ืื ืืืืื ืฉืืื (ืื ืืฉืื ืืืจ).
ืืื ืืืืืจ ืืฉื ื ืขื ืืืืงืฆ'ืืื ืืชืขืฉืืื, ืืจืืฉืื
ืืฉืืืืจืื ืืช ืืฉืืืืช ืฉืฉืืื ืืืชื ืืงืืจืืื ืืืื ืืืืืจ ืืงืืื ืืกืืจื ืื, ืืฉ ืืฆืืื: ืืืงืจื ืื, ืืกื ืื ืชืื ืื ืฉื LevelDB ืืฉืืฉ ืืืืกืื ื ืชืื ื ืืืืงืฆ'ืืื, ืืื ืฉืื ืืืจ ืื ืืื ืข ืืื ืืืฉืชืืฉ ืืื, ืืืฉื, 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 ืฉื ืืขืกืงื ืฉืืคืื ืฉืื ืืืคื ื, ืืช ืืกืคืจ ืืคืื ืื-bytecode, ืืืฆืืืืช TxOut ืืืืกื ืืช ืขืจื ืืกืืื ืืื ืงืื ืืชืื.
ืืขืช ื ืจืื ืืืื ืคืขืืืืช ืขืกืงื ืืืืื ืืืฆืข ืขื ืื ืชืื ืื ืฉืื, ืืืืืจ. ืืืื ื ืกืชืื ืขื ืืฉืืืืช.
ืืื ืืืฆืืจ ืขืกืงื, ืืฉืชืืฉ ืืคืื ืงืฆืื transaction.NewTransaction(TXtype byte) *TX.
ืืฉืืื AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) ืืืกืืคื ืงืื ืืขืกืงื.
ืืฉืืื AddTxOut(value int, data []byte) (*TxOut, error) ืืืกืืคื ืคืื ืืขืกืงื.
ืืฉืืื ToBytes() []byte ืืืคืืช ืืช ืืขืกืงื ืืคืจืืกืช ืืชืื.
ืืคืื ืงืฆืื ืืคื ืืืืช preByteHash(bytes []byte) ืืฉืืฉืช ื-Build() ืื-Check() ืืื ืืืคืื ืืช ื-hash ืฉื ืืขืกืงื ืฉื ืืฆืจ ืืชืืื ื-hash ืฉื ืืจื ืืงืฆืืืช ืฉื ืืฆืจื ืืืืฉืืื JavaScript.
ืืฉืืื Build() ืืืืืจื ืืช ื-hash ืฉื ืืขืกืงื ืืืืคื ืืื: tx.TxHash = preByteHash(tx.ToBytes()).
ืฉืืืช ืืืืจืืืช ToJSON() ืืืืจื ืขืกืงื ืืืืจืืืช JSON.
ืฉืืืช ืืฉืืืื FromJSON(data []byte) ืืืขื ืช ืขืกืงื ืืคืืจืื JSON ืืืืขืืจ ืืคืจืืกืช ืืชืื.
ืฉืืืช Check() bool ืืฉืืื ืืช ื-hash ืืืชืงืื ืืฉืื ื-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 ืืืืกื ืืช ืกืื ืื ืชืื ืื, ืืฆืืืช ืืฉืชืืฉ ืื ืืืืืื ืืช ืืืืืง ืืขืกืงื ืื ื ืชืื ืื ืืืจืื. ืขืืืจ ืืืืง ืขืจื ืื ืืื 1.
BlockHeight ืืืืกื ืืช ืืืื ืืืืืง.
ืืืชืืช ืืื.
HeaderSize ืืื ืืืื ืืืืืง ืืืชืื.
PrevBlockHash ืืื ื-hash ืฉื ืืืืืง ืืงืืื, ื-SelfBlockHash ืืื ื-hash ืฉื ืืืืืง ืื ืืืื.
TxsHash ืืื ืืืืื ืืืื ืฉื ืขืกืงืืืช.
MerkleRoot ืืื ืืฉืืจืฉ ืฉื ืขืฅ ืืจืงื.
ืืืืฉื ืืฉืืืช ืืฉ ืืช ืืืคืชื ืืฆืืืืจื ืฉื ืืืฆืจ ืืืืืง, ืืชืืืช ืืืืฆืจ, ืืจืกืช ืืืืืง, ืืกืคืจ ืืขืกืงืืืช ืืืืืง ืืขืกืงืืืช ืืื ืขืฆืื.
ืืืื ื ืกืชืื ืขื ืืฉืืืืช ืฉืื:
ืืื ืืืฆืืจ ืืืืง, ืืฉืชืืฉ ืืคืื ืงืฆืื block.NewBlock(): NewBlock(prevBlockHash string, height int) *Block, ืฉืืืงื ืืช ื-hash ืฉื ืืืืืง ืืงืืื ืืืช ืืืืื ืฉื ืงืืข ืืืืืง ืฉื ืืฆืจ ืืืืืงืฆ'ืืื. ืกืื ืืืืืง ื ืงืืข ืื ืืชืื ืงืืืข ืืืืืช ืืกืืืื:
b.DataType = types.BLOCK_TYPE.
ืืฉืืื AddTx(tx *transaction.TX) ืืืกืืคื ืืจื ืืงืฆืื ืืืืืง.
ืฉืืืช Build() ืืืขื ืช ืขืจืืื ืืฉืืืช ืืืืืง ืืืืฆืจืช ืืืืืืจื ืืช ื-hash ืื ืืืื ืฉืื.
ืืฉืืื ToBytesHeader() []byte ืืืืจื ืืช ืืืชืจืช ืืืืืง (ืืื ืืจื ืืงืฆืืืช) ืืคืจืืกืช ืืชืื.
ืฉืืืช ืืืืจืืืช ToJSON() ืืืืจื ืืช ืืืืืง ืืคืืจืื JSON ืืืืฆืื ืืืจืืืช ืฉื ืื ืชืื ืื.
ืฉืืืช ืืฉืืืื FromJSON(data []byte) ืืืขื ืช ื ืชืื ืื ื-JSON ืืืื ื ืืืืง.
ืืฉืืื Check() bool ืืืืฆืจืช ืืืืื ืฉื ืืืืง ืืืฉืืื ืืืชื ืืื ืฉืฆืืื ืืฉืื ืืืืืื ืฉื ืืืืืง.
ืฉืืืช ืืืืจืืืช GetTxsHash() ืืืืืจื ืืช ืกื ื-hash ืฉื ืื ืืขืกืงืืืช ืืืืืง.
ืืฉืืื GetMerkleRoot() ืืฆืืื ืช ืืช ืืฉืืจืฉ ืฉื ืขืฅ Merkle ืขืืืจ ืขืกืงืืืช ืืืืืง.
ืฉืืืช Sign(privk string) ืืืชืืช ืืืืง ืขื ืืืคืชื ืืคืจืื ืฉื ืืืฆืจ ืืืืืง.
ืฉืืืช SetHeight(height int) ืืืชืืช ืืช ืืืื ืืืืืง ืืฉืื ืืื ื ืืืืืง.
ืืฉืืื GetHeight() int ืืืืืจื ืืช ืืืื ืืืืืง ืืคื ืฉืฆืืื ืืฉืื ืืืชืืื ืฉื ืืื ื ืืืืืง.
ืฉืืืช ToGOBBytes() []byte ืืงืืืืช ืืืืง ืืคืืจืื GOB ืืืืืืจื ืืืชื ืืคืจืืกืช ืืชืื.
ืฉืืืช ืืฉืืืื FromGOBBytes(data []byte) ืืืชืืช ื ืชืื ื ืืืืง ืืืื ื ืืืืืง ืืคืจืืกืช ืืืชืื ืืืืขืืจืช ืืคืืจืื GOB.
ืฉืืืช ืืืืจืืืช GetHash() ืืืืืจื ืืช ื-hash ืฉื ืืืืืง ืื ืชืื.
ืฉืืืช ืืืืจืืืช GetPrevHash() ืืืืืจื ืืช ื-hash ืฉื ืืืืืง ืืงืืื.
ืฉืืืช SetPublicKey(pubk string) ืืืชืืช ืืช ืืืคืชื ืืฆืืืืจื ืฉื ืืืฆืจ ืืืืืง ืืืืืง.
ืื, ืืืืฆืขืืช ืืฉืืืืช ืฉื ืืืืืืงื ื-Block, ื ืืื ืืืืืจ ืืืชื ืืงืืืช ืืคืืจืื ืืฉืืืืจ ืืจื ืืจืฉืช ืืืฉืืืจื ืืืกื ืื ืชืื ืื LevelDB.
ืืคืื ืงืฆืืืช ืฉื ืืืืืช ืืืืืงืฆ'ืืื ืืืจืืืืช ืืฉืืืจื ืืืืืงืฆ'ืืื:
ืืฉื ืื, ืืืืืง ืืืื ืืืืฉื ืืช ืืืฉืง 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) ืืืชืืช ืืช ื-hash ืฉื ืืืืืง ืื ืืืื ืขื ืืืคืชื ืฉืฆืืื ืขื ืืื ืืงืืืข BLOCK_HASH ืืืกื ืื ืชืื ืื.
ืืคืื ืงืฆืื GetTargetBlockHash() (ืืืจืืืช, ืฉืืืื) ืืืืืจื ืืช ื-hash ืฉื ืืืืืง ืื ืืืื ืืืืืืกื ืืืกื ืื ืชืื ืื.
ืคืื ืงืฆืืืช ืืฉืืืื SetTargetBlockHeight(height int) ืืืชืืช ืืืกื ืื ืชืื ืื ืืช ืืขืจื ืฉื ืืืื ืืืืืงืฆ'ืืื ืขืืืจ ืืฆืืืช ืขื ืืืคืชื ืฉืฆืืื ืืงืืืข BLOCK_HEIGHT.
ืืคืื ืงืฆืื GetTargetBlockHeight() (int, error) ืืืืืจื ืืช ืืืื ืืืืืงืฆ'ืืื ืขืืืจ ืฆืืืช ื ืชืื, ืืืืืืกื ืืืกื ืื ืชืื ืื.
ืืคืื ืงืฆืื CheckBlock(block IBlock) bool ืืืืงืช ืชืงืื ืืช ืฉื ืืืืง ืืคื ื ืืืกืคืช ืืืืืง ืืื ืืืืืงืฆ'ืืื.
ืคืื ืงืฆืืืช ืืฉืืืื AddBlock(ืืืืง IBlock) ืืืกืืคื ืืืืง ืืืืืงืฆ'ืืื.
ืืคืื ืงืฆืืืช ืืืืืืจ ืืืฆืืช ืืืืงืื ื ืืฆืืืช ืืงืืืฅ explore.go ืฉื ืืืืืช ืืืืืงืฆ'ืืื:
ืืคืื ืงืฆืื GetBlockByHash(ืืืจืืืช hash) (*block.Block, error) ืืืฆืจืช ืืืืืืงื ืืืืง ืจืืง, ืืืขื ืช ืืชืืื ืืืืง ืืืกื ืื ืชืื ืื, ืฉื-hash ืฉืื ืืืขืืจ ืืืื, ืืืืืืจื ืืืื ืืฆืืืข.
ืืืฆืืจื ืฉื ืืืืง genesis ืืชืืฆืขืช ืขื ืืื ืคืื ืงืฆืืืช ืืฉืืืื Genesis() ืืืงืืืฅ genesis.go ืฉื ืืืืืช ืืืืืงืฆ'ืืื.
ืืืืืจ ืืื ืืืืจ ืขื ืืืืืจ ืืฆืืืช ืืงืื ืืืืฆืขืืช ืื ืื ืื WebSocket.
ืืงืืจ: www.habr.com