āĻļā§āĻˇ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻļā§āĻˇ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŦāĻ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻāĻāĻŋ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ āĻ¨āĻ¯āĻŧ, āĻāĻŽāĻžāĻĻā§āĻ° āĻĒā§āĻ°āĻāĻ˛ā§āĻĒā§ 3āĻāĻŋ āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻāĻĒāĻžāĻĻāĻžāĻ¨ āĻ¯ā§āĻā§āĻ¤ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§:
- āĻŦā§āĻ˛āĻ āĻĄā§āĻāĻž āĻ¸ā§āĻā§āĻ°āĻžāĻāĻāĻžāĻ° āĻāĻŦāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž
- āĻĄā§āĻāĻž āĻ¸ā§āĻā§āĻ°āĻžāĻāĻāĻžāĻ° āĻāĻŦāĻ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž
- āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ āĻĢāĻžāĻāĻļāĻ¨ āĻ¯āĻž āĻāĻāĻāĻŋ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§ āĻŦā§āĻ˛āĻ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°ā§ āĻāĻŦāĻ āĻ¤āĻžāĻĻā§āĻ° āĻšā§āĻ¯āĻžāĻļ āĻŦāĻž āĻāĻā§āĻāĻ¤āĻž (āĻŦāĻž āĻ āĻ¨ā§āĻ¯ āĻāĻŋāĻā§) āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§āĻāĻžāĻ¨ā§ āĻā§āĻāĻā§ āĻĒāĻžāĻ¯āĻŧāĨ¤
āĻāĻāĻŋ āĻļāĻŋāĻ˛ā§āĻĒā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§, āĻĒā§āĻ°āĻĨāĻŽ
āĻāĻ āĻ¸āĻŋāĻ°āĻŋāĻā§āĻ° āĻĒā§āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻĒāĻžāĻ āĻāĻ°āĻž āĻāĻŽāĻžāĻā§ āĻ¯ā§ āĻĒā§āĻ°āĻļā§āĻ¨āĻā§āĻ˛āĻŋ āĻāĻŋāĻā§āĻāĻžāĻ¸āĻž āĻāĻ°ā§āĻāĻŋāĻ˛ā§āĻ¨ āĻ¤āĻž āĻŽāĻ¨ā§ āĻ°ā§āĻā§, āĻāĻāĻŋ āĻ˛āĻā§āĻˇ āĻāĻ°āĻž āĻāĻāĻŋāĻ¤: āĻāĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻ˛ā§āĻā§āĻ˛āĻĄāĻŋāĻŦāĻŋ āĻĄā§āĻāĻžāĻŦā§āĻ¸ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ āĻĄā§āĻāĻž āĻ¸āĻā§āĻāĻ¯āĻŧ āĻāĻ°āĻ¤ā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧ, āĻ¤āĻŦā§ āĻāĻŋāĻā§āĻ āĻāĻĒāĻ¨āĻžāĻā§ āĻ āĻ¨ā§āĻ¯ āĻā§āĻ¨āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻŦāĻžāĻ§āĻž āĻĻā§āĻ¯āĻŧ āĻ¨āĻž, āĻŦāĻ˛ā§āĻ¨, āĻŽāĻžāĻāĻāĻ¸āĻāĻŋāĻāĻāĻ˛ā§ˇ āĻāĻāĻ¨ āĻāĻ āĻĄā§āĻāĻžāĻ° āĻāĻ āĻ¨ āĻĻā§āĻāĻŋāĨ¤
āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻĻāĻŋāĻ¯āĻŧā§ āĻļā§āĻ°ā§ āĻāĻ°āĻž āĻ¯āĻžāĻ:
āĻāĻāĻžāĻ¨ā§ āĻāĻ° āĻĄā§āĻāĻž āĻāĻžāĻ āĻžāĻŽā§ āĻ°āĻ¯āĻŧā§āĻā§:
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 āĻāĻāĻāĻĒā§āĻ āĻāĻŋāĻā§ āĻŽāĻžāĻ¨ āĻ¸āĻā§āĻāĻ¯āĻŧ āĻāĻ°ā§ āĻāĻŦāĻ āĻŦāĻžāĻāĻāĻā§āĻĄāĻ āĻ°āĻžāĻā§āĨ¤
āĻāĻāĻ¨ āĻĻā§āĻāĻž āĻ¯āĻžāĻ āĻāĻāĻāĻŋ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻ¤āĻžāĻ° āĻĄā§āĻāĻžāĻ¤ā§ āĻā§ āĻā§ āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻ¯ā§āĻŽāĻ¨ āĻāĻ˛ā§āĻ¨ āĻĻā§āĻā§ āĻ¨ā§āĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻā§āĻ˛ā§āĨ¤
āĻāĻāĻāĻŋ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§, transaction.NewTransaction(txtype byte) *TX āĻĢāĻžāĻāĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĻ¨āĨ¤
AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§ āĻāĻāĻāĻŋ āĻāĻ¨āĻĒā§āĻ āĻ¯ā§āĻ āĻāĻ°ā§āĨ¤
AddTxOut(value int, data []byte) (*TxOut, āĻ¤ā§āĻ°ā§āĻāĻŋ) āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§ āĻāĻāĻāĻŋ āĻāĻāĻāĻĒā§āĻ āĻ¯ā§āĻ āĻāĻ°ā§āĨ¤
ToBytes() []āĻŦāĻžāĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ˛ā§āĻ¨āĻĻā§āĻ¨āĻāĻŋāĻā§ āĻāĻāĻāĻŋ āĻŦāĻžāĻāĻ āĻ¸ā§āĻ˛āĻžāĻāĻ¸ā§ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻāĻ°ā§āĨ¤
āĻ āĻā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§āĻŖ āĻĢāĻžāĻāĻļāĻ¨ preByteHash(bytes []byte) āĻ¸ā§āĻā§āĻ°āĻŋāĻāĻāĻŋ Build() āĻāĻŦāĻ Check()-āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¯āĻžāĻ¤ā§ āĻā§āĻ¨āĻžāĻ°ā§āĻ āĻāĻ°āĻž āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻšā§āĻ¯āĻžāĻļ āĻāĻžāĻāĻžāĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻĨā§āĻā§ āĻā§āĻ¨āĻžāĻ°ā§āĻ āĻāĻ°āĻž āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻšā§āĻ¯āĻžāĻļā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻžāĻŽāĻā§āĻāĻ¸ā§āĻ¯āĻĒā§āĻ°ā§āĻŖ āĻšāĻ¯āĻŧāĨ¤
Build() āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§āĻĒ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻšā§āĻ¯āĻžāĻļ āĻ¸ā§āĻ āĻāĻ°ā§: tx.TxHash = preByteHash(tx.ToBytes())āĨ¤
ToJSON() āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻāĻāĻāĻŋ āĻ˛ā§āĻ¨āĻĻā§āĻ¨āĻā§ JSON āĻ¸ā§āĻā§āĻ°āĻŋāĻ-āĻ āĻ°ā§āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°ā§āĨ¤
FromJSON(data []byte) āĻ¤ā§āĻ°ā§āĻāĻŋ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻāĻāĻāĻŋ āĻŦāĻžāĻāĻ āĻ¸ā§āĻ˛āĻžāĻāĻ¸ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻĒāĻžāĻ¸ āĻāĻ°āĻž 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 āĻšāĻ˛ Merkle āĻāĻžāĻā§āĻ° āĻŽā§āĻ˛āĨ¤
āĻāĻ°āĻ āĻā§āĻˇā§āĻ¤ā§āĻ°āĻā§āĻ˛āĻŋāĻ¤ā§ āĻŦā§āĻ˛āĻā§āĻ° āĻ¸ā§āĻ°āĻˇā§āĻāĻžāĻ° āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§, āĻ¸ā§āĻ°āĻˇā§āĻāĻžāĻ° āĻ¸ā§āĻŦāĻžāĻā§āĻˇāĻ°, āĻŦā§āĻ˛āĻā§āĻ° āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ, āĻŦā§āĻ˛āĻā§ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻž āĻāĻŦāĻ āĻāĻ āĻ˛ā§āĻ¨āĻĻā§āĻ¨āĻā§āĻ˛āĻŋ āĻ¨āĻŋāĻā§āĻ°āĻžāĻ āĻ°āĻ¯āĻŧā§āĻā§āĨ¤
āĻāĻ˛ā§āĻ¨ āĻĻā§āĻā§ āĻ¨ā§āĻ āĻāĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻā§āĻ˛ā§:
āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§, block.NewBlock() āĻĢāĻžāĻāĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĻ¨: NewBlock(prevBlockHash string, height int) *Block, āĻ¯āĻž āĻāĻā§āĻ° āĻŦā§āĻ˛āĻā§āĻ° āĻšā§āĻ¯āĻžāĻļ āĻ¨ā§āĻ¯āĻŧ āĻāĻŦāĻ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ā§ āĻ¤ā§āĻ°āĻŋ āĻŦā§āĻ˛āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻ āĻāĻ°āĻž āĻāĻā§āĻāĻ¤āĻžāĨ¤ āĻŦā§āĻ˛āĻā§āĻ° āĻ§āĻ°āĻ¨āĻāĻŋ āĻĒā§āĻ°āĻāĻžāĻ° āĻĒā§āĻ¯āĻžāĻā§āĻ āĻ§ā§āĻ°ā§āĻŦāĻ āĻĨā§āĻā§āĻ āĻ¸ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§:
b.DataType = types.BLOCK_TYPE.
AddTx(tx *transaction.TX) āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻā§ āĻāĻāĻāĻŋ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻ¯ā§āĻ āĻāĻ°ā§āĨ¤
Build() āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ˛āĻā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°āĻā§āĻ˛āĻŋāĻ¤ā§ āĻŽāĻžāĻ¨ āĻ˛ā§āĻĄ āĻāĻ°ā§ āĻāĻŦāĻ āĻāĻ° āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻšā§āĻ¯āĻžāĻļ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§ āĻāĻŦāĻ āĻ¸ā§āĻ āĻāĻ°ā§āĨ¤
ToBytesHeader() []āĻŦāĻžāĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ˛āĻ āĻšā§āĻĄāĻžāĻ°āĻā§ (āĻ˛ā§āĻ¨āĻĻā§āĻ¨ āĻāĻžāĻĄāĻŧāĻž) āĻāĻāĻāĻŋ āĻŦāĻžāĻāĻ āĻ¸ā§āĻ˛āĻžāĻāĻ¸ā§ āĻ°ā§āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°ā§āĨ¤
ToJSON() āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ˛āĻāĻāĻŋāĻā§ JSON āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻā§ āĻĄā§āĻāĻžāĻ° āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻāĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻžāĻ¯āĻŧ āĻ°ā§āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°ā§āĨ¤
FromJSON(data []byte) āĻ¤ā§āĻ°ā§āĻāĻŋ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ JSON āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻ āĻāĻžāĻ āĻžāĻŽā§āĻ¤ā§ āĻĄā§āĻāĻž āĻ˛ā§āĻĄ āĻāĻ°ā§āĨ¤
āĻā§āĻ() āĻŦā§āĻ˛ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻ āĻšā§āĻ¯āĻžāĻļ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§ āĻāĻŦāĻ āĻŦā§āĻ˛āĻ āĻšā§āĻ¯āĻžāĻļ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻāĻāĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻ¤ā§āĻ˛āĻ¨āĻž āĻāĻ°ā§āĨ¤
GetTxsHash() āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ˛āĻā§āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§āĻ° āĻŽā§āĻ āĻšā§āĻ¯āĻžāĻļ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤
GetMerkleRoot() āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻā§ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ Merkle āĻāĻžāĻā§āĻ° āĻŽā§āĻ˛ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°ā§āĨ¤
āĻ¸āĻžāĻāĻ¨ (āĻĒā§āĻ°āĻŋāĻāĻŋāĻā§ āĻ¸ā§āĻā§āĻ°āĻŋāĻ) āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ˛āĻ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻ¤āĻžāĻ° āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻāĻ¤ āĻā§ āĻĻāĻŋāĻ¯āĻŧā§ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻāĻā§ āĻ¸āĻžāĻāĻ¨ āĻāĻ¨ āĻāĻ°ā§āĨ¤
SetHeight(height int) āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ˛āĻā§āĻ° āĻāĻā§āĻāĻ¤āĻžāĻā§ āĻŦā§āĻ˛āĻ āĻ¸ā§āĻā§āĻ°āĻžāĻāĻāĻžāĻ° āĻĢāĻŋāĻ˛ā§āĻĄā§ āĻ˛ā§āĻā§āĨ¤
GetHeight() int āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ˛āĻā§āĻ° āĻāĻā§āĻāĻ¤āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§ āĻ¯āĻž āĻŦā§āĻ˛āĻ āĻāĻžāĻ āĻžāĻŽā§āĻ° āĻ¸āĻāĻļā§āĻ˛āĻŋāĻˇā§āĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻāĻ˛ā§āĻ˛ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤
ToGOBBytes() []āĻŦāĻžāĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻāĻŋāĻāĻŦāĻŋ āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻā§ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻāĻā§ āĻāĻ¨āĻā§āĻĄ āĻāĻ°ā§ āĻāĻŦāĻ āĻāĻāĻŋāĻā§ āĻŦāĻžāĻāĻ āĻ¸ā§āĻ˛āĻžāĻāĻ¸ āĻšāĻŋāĻ¸ā§āĻŦā§ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§ āĻĻā§āĻ¯āĻŧāĨ¤
FromGOBBytes(data []byte) āĻāĻ°āĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋ GOB āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻā§ āĻĒāĻžāĻ¸ āĻāĻ°āĻž āĻŦāĻžāĻāĻ āĻ¸ā§āĻ˛āĻžāĻāĻ¸ āĻĨā§āĻā§ āĻŦā§āĻ˛āĻ āĻ¸ā§āĻā§āĻ°āĻžāĻāĻāĻžāĻ°ā§ āĻŦā§āĻ˛āĻ āĻĄā§āĻāĻž āĻ˛ā§āĻā§āĨ¤
GetHash() āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻŦā§āĻ˛āĻā§āĻ° āĻšā§āĻ¯āĻžāĻļ āĻĢā§āĻ°āĻ¤ āĻĻā§āĻ¯āĻŧāĨ¤
GetPrevHash() āĻ¸ā§āĻā§āĻ°āĻŋāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻĒā§āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§ āĻŦā§āĻ˛āĻā§āĻ° āĻšā§āĻ¯āĻžāĻļ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤
SetPublicKey(pubk āĻ¸ā§āĻā§āĻ°āĻŋāĻ) āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ˛āĻā§ āĻŦā§āĻ˛āĻ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻ¤āĻžāĻ° āĻĒāĻžāĻŦāĻ˛āĻŋāĻ āĻā§ āĻ˛āĻŋāĻā§āĨ¤
āĻāĻāĻāĻžāĻŦā§, āĻŦā§āĻ˛āĻ āĻ āĻŦāĻā§āĻā§āĻā§āĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§, āĻāĻŽāĻ°āĻž āĻ¸āĻšāĻā§āĻ āĻāĻāĻŋāĻā§ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻā§ āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻāĻŦāĻ āĻ˛ā§āĻā§āĻ˛āĻĄāĻŋāĻŦāĻŋ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ā§ āĻ°ā§āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĨ¤
āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻāĻžāĻāĻā§āĻ˛āĻŋ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§:
āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻŦā§āĻ˛āĻāĻāĻŋāĻā§ āĻ āĻŦāĻļā§āĻ¯āĻ 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(height int) āĻ¤ā§āĻ°ā§āĻāĻŋ āĻĢāĻžāĻāĻļāĻ¨ BLOCK_HEIGHT āĻ§ā§āĻ°ā§āĻŦāĻ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻā§ āĻĻāĻŋāĻ¯āĻŧā§ āĻ¨ā§āĻĄā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ āĻāĻā§āĻāĻ¤āĻžāĻ° āĻŽāĻžāĻ¨ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§ āĻ˛āĻŋāĻā§āĨ¤
GetTargetBlockHeight() (int, error) āĻĢāĻžāĻāĻļāĻ¨ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŋāĻ¤ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻ¨ā§āĻĄā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ā§āĻ° āĻāĻā§āĻāĻ¤āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤
CheckBlock(block IBlock) bool āĻĢāĻžāĻāĻļāĻ¨ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ā§ āĻāĻ āĻŦā§āĻ˛āĻ āĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻāĻā§ āĻ¸āĻ āĻŋāĻāĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§āĨ¤
AddBlock(block IBlock) āĻāĻ°āĻ° āĻĢāĻžāĻāĻļāĻ¨ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ā§ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻ āĻ¯ā§āĻ āĻāĻ°ā§āĨ¤
āĻŦā§āĻ˛āĻ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻāĻŦāĻ āĻĻā§āĻāĻžāĻ° āĻĢāĻžāĻāĻļāĻ¨ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° explore.go āĻĢāĻžāĻāĻ˛ā§ āĻ°āĻ¯āĻŧā§āĻā§:
GetBlockByHash(āĻšā§āĻ¯āĻžāĻļ āĻ¸ā§āĻā§āĻ°āĻŋāĻ) (*block.Block, error) āĻĢāĻžāĻāĻļāĻ¨ āĻāĻāĻāĻŋ āĻāĻžāĻ˛āĻŋ āĻŦā§āĻ˛āĻ āĻ āĻŦāĻā§āĻā§āĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§, āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ āĻĨā§āĻā§ āĻāĻāĻŋāĻ¤ā§ āĻāĻāĻāĻŋ āĻŦā§āĻ˛āĻ āĻ˛ā§āĻĄ āĻāĻ°ā§, āĻ¯āĻžāĻ° āĻšā§āĻ¯āĻžāĻļ āĻāĻāĻŋāĻ¤ā§ āĻĒāĻžāĻ¸ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ āĻāĻŦāĻ āĻāĻāĻŋāĻ¤ā§ āĻāĻāĻāĻŋ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻžāĻ° āĻĢā§āĻ°āĻ¤ āĻĻā§āĻ¯āĻŧāĨ¤
āĻāĻāĻāĻŋ āĻā§āĻ¨ā§āĻ¸āĻŋāĻ¸ āĻŦā§āĻ˛āĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻŦā§āĻ˛āĻāĻā§āĻāĻ¨ āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° genesis.go āĻĢāĻžāĻāĻ˛ āĻĨā§āĻā§ āĻā§āĻ¨ā§āĻ¸āĻŋāĻ¸() āĻāĻ°āĻ° āĻĢāĻžāĻāĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻžāĨ¤
āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋ WebSocket āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻāĻāĻŋ āĻ¨ā§āĻĄā§ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻāĻĻā§āĻ° āĻ¸āĻāĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§ āĻāĻĨāĻž āĻŦāĻ˛āĻŦā§āĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com