αžšαž”αŸ€αž”αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžšαž…αž“αžΆαž”αŸ’αž›αž»αž€ αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Go blockchain αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αž”αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„ blockchain αž“αž·αž„αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αž’αžΆαžαž»αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž…αŸ†αž“αž½αž“ 3 αž‘αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

  • αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αž›αž»αž€ αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž
  • αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš
  • αž˜αž»αžαž„αžΆαžš Blockchain αžŠαŸ‚αž›αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž”αŸ’αž›αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αž–αž½αž€αžœαžΆαž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αžŠαŸ„αž™αžŸαž‰αŸ’αž‰αžΆ αž¬αž€αž˜αŸ’αž–αžŸαŸ‹ (αž¬αž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αž)αŸ”

αžšαž”αŸ€αž”αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžšαž…αž“αžΆαž”αŸ’αž›αž»αž€ αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ 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) αžŸαž‰αŸ’αž‰αžΆαž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸ„αŸ‡ αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αžαŸ’αžšαžΆαž–αŸαž›αžœαŸαž›αžΆ αž“αž·αž„αž’αžΆαžαž»αž”αž‰αŸ’αž…αžΌαž› αž“αž·αž„αž›αž‘αŸ’αž’αž•αž›αŸ” αž’αžΆαžαž»αž”αž‰αŸ’αž…αžΌαž› TxIn αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ hash αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž‘αž·αž“αŸ’αž“αž•αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αŸ„αž„ αž…αŸ†αž“αž½αž“αž“αŸƒαž›αž‘αŸ’αž’αž•αž› αž“αž·αž„ bytecode αž“αŸαŸ‡ αž αžΎαž™αž›αž‘αŸ’αž’αž•αž› TxOut αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžαž˜αŸ’αž›αŸƒαž˜αž½αž™αž…αŸ†αž“αž½αž“ αž“αž·αž„ bytecode αž•αž„αžŠαŸ‚αžšαŸ”

αž₯αž‘αžΌαžœβ€‹αž™αžΎαž„β€‹αž˜αžΎαž›β€‹αžαžΆβ€‹αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–β€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšβ€‹αž’αžΆαž…β€‹αž’αŸ’αžœαžΎβ€‹αž”αžΆαž“β€‹αž›αžΎβ€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αžšαž”αžŸαŸ‹β€‹αžœαžΆ ឧ. αžαŸ„αŸ‡αž˜αžΎαž›αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αžŸαžΌαž˜αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžš 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() αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž‰αŸ’αž‰αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ JavaScript αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Build() αž€αŸ†αžŽαžαŸ‹ hash αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ– tx.TxHash = preByteHash(tx.ToBytes()) αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš ToJSON() αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αŸ…αž‡αžΆαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš JSON αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž€αŸ†αž αž»αžŸ FromJSON(αž‘αž·αž“αŸ’αž“αž“αŸαž™ []byte) αž•αŸ’αž‘αž»αž€αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž–αžΈαž‘αž˜αŸ’αžšαž„αŸ‹ JSON αžŠαŸ‚αž›αž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž‡αžΆαž”αžŽαŸ’αžαž»αŸ†αž”αŸƒαŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Check() bool αž”αŸ’αžšαŸ€αž”αž’αŸ€αž” hash αž›αž‘αŸ’αž’αž•αž›αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš hash field αž‡αžΆαž˜αž½αž™αž“αžΉαž„ hash αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“ αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžš hashing αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸαŸ‡ (αž˜αž·αž“αž’αžΎαž–αžΎαž“αžΉαž„ hash field)αŸ”

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž”αŸ’αž›αž»αž€αŸ– 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 αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž”αŸ’αžšαž—αŸαž‘αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžαŸ’αž“αžΆαŸ†αž„αž”αŸ’αžšαžΎαžœαžΆ αž“αž·αž„αž”αŸ‚αž„αž…αŸ‚αž€αž”αŸ’αž›αž»αž€αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš αž¬αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αž›αž»αž€αžαž˜αŸ’αž›αŸƒαž“αŸαŸ‡αž‚αžΊ 1 αŸ”

BlockHeight αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αž˜αŸ’αž–αžŸαŸ‹αž“αŸƒαž”αŸ’αž›αž»αž€αŸ”
αžαŸ’αžšαžΆαž–αŸαž›αžœαŸαž›αžΆαŸ”
HeaderSize αž‚αžΊαž‡αžΆαž‘αŸ†αž αŸ†αž”αŸ’αž›αž»αž€αž‚αž·αžαž‡αžΆαž”αŸƒαŸ”
PrevBlockHash αž‚αžΊαž‡αžΆαžŸαž‰αŸ’αž‰αžΆαž“αŸƒαž”αŸ’αž›αž»αž€αž˜αž»αž“ αž αžΎαž™ SelfBlockHash αž‚αžΊαž‡αžΆαžŸαž‰αŸ’αž‰αžΆαž“αŸƒαž”αŸ’αž›αž»αž€αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ”
TxsHash αž‚αžΊαž‡αžΆαžŸαž‰αŸ’αž‰αžΆαž‘αžΌαž‘αŸ…αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ”
MerkleRoot αž‚αžΊαž‡αžΆαž«αžŸαž“αŸƒαž˜αŸ‚αž€αž’αžΆαž„ Merkle αŸ”

αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž›αž˜αžΆαž“αžŸαŸ„αžŸαžΆαž’αžΆαžšαžŽαŸˆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž”αŸ’αž›αž»αž€ αž αžαŸ’αžαž›αŸαžαžΆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž αž€αŸ†αžŽαŸ‚αž”αŸ’αž›αž»αž€ αž…αŸ†αž“αž½αž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€ αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ”

αžαŸ„αŸ‡αž˜αžΎαž›αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžšαž”αžŸαŸ‹αžœαžΆαŸ–
αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž”αŸ’αž›αž»αž€ αžŸαžΌαž˜αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžš block.NewBlock()αŸ– NewBlock(prevBlockHash string, height int) *Block αžŠαŸ‚αž›αž™αž€ hash αž“αŸƒαž”αŸ’αž›αž»αž€αž˜αž»αž“ αž“αž·αž„αž€αž˜αŸ’αž–αžŸαŸ‹αž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αž›αž»αž€αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž“αŸ…αž€αŸ’αž“αž»αž„ blockchainαŸ” αž”αŸ’αžšαž—αŸαž‘αž”αŸ’αž›αž»αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž•αž„αžŠαŸ‚αžšαž–αžΈαž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αžαŸαžšαŸ–

b.DataType = types.BLOCK_TYPE.

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš AddTx(tx *transaction.TX) αž”αž“αŸ’αžαŸ‚αž˜αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αŸ…αž”αŸ’αž›αž»αž€αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Build() αž•αŸ’αž‘αž»αž€αžαž˜αŸ’αž›αŸƒαž‘αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž›αžšαž”αžŸαŸ‹αž”αŸ’αž›αž»αž€ αž αžΎαž™αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžŸαž‰αŸ’αž‰αžΆαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžšαž”αžŸαŸ‹αžœαžΆαŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš ToBytesHeader() []byte αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž”αž‹αž˜αž€αžαžΆαž”αŸ’αž›αž»αž€ (αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš) αž‘αŸ…αž‡αžΆαž”αŸ†αžŽαŸ‚αž€αž”αŸƒαŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš ToJSON() αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž”αŸ’αž›αž»αž€αž‘αŸ…αž‡αžΆαž‘αž˜αŸ’αžšαž„αŸ‹ JSON αž€αŸ’αž“αž»αž„αžαŸ†αžŽαžΆαž„αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž€αŸ†αž αž»αžŸ FromJSON(αž‘αž·αž“αŸ’αž“αž“αŸαž™ []αž”αŸƒ) αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈ JSON αž‘αŸ…αž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αž›αž»αž€αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Check() bool αž”αž„αŸ’αž€αžΎαž block hash αž αžΎαž™αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αžœαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ block hash fieldαŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš GetTxsHash() αžαŸ’αžšαž‘αž”αŸ‹ hash αžŸαžšαž»αž”αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš GetMerkleRoot() αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž«αžŸαž‚αž›αŸ‹αž“αŸƒαž˜αŸ‚αž€αž’αžΆαž„ Merkle αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Sign(privk string) αž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαž›αžΎαž”αŸ’αž›αž»αž€αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ„αž―αž€αž‡αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž”αŸ’αž›αž»αž€αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš SetHeight(height int) αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž–αžŸαŸ‹αž”αŸ’αž›αž»αž€αž‘αŸ…αžœαžΆαž›αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αž›αž»αž€αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš GetHeight() int αžαŸ’αžšαž‘αž”αŸ‹αž€αž˜αŸ’αž–αžŸαŸ‹αž”αŸ’αž›αž»αž€αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž›αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αŸƒαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αž›αž»αž€αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš ToGOBBytes() []byte αž’αŸŠαž·αž“αž€αžΌαžŠαž”αŸ’αž›αž»αž€αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹ GOB αž αžΎαž™αžαŸ’αžšαž‘αž”αŸ‹αžœαžΆαž‡αžΆαž”αžŽαŸ’αžαž»αŸ†αž”αŸƒαŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž€αŸ†αž αž»αžŸ FromGOBBytes(αž‘αž·αž“αŸ’αž“αž“αŸαž™ []αž”αŸƒ) αžŸαžšαžŸαŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αž›αž»αž€αž‘αŸ…αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ’αž›αž»αž€αž–αžΈαž…αŸ†αžŽαž·αžαž”αŸƒαž”αŸƒαžŠαŸ‚αž›αž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹ GOB αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš GetHash() αžαŸ’αžšαž‘αž”αŸ‹ hash αž“αŸƒαž”αŸ’αž›αž»αž€αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš GetPrevHash() αžαŸ’αžšαž‘αž”αŸ‹ hash αž“αŸƒαž”αŸ’αž›αž»αž€αž˜αž»αž“αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš SetPublicKey(pubk string) αžŸαžšαžŸαŸαžšαžŸαŸ„αžŸαžΆαž’αžΆαžšαžŽαŸˆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž”αŸ’αž›αž»αž€αž‘αŸ…αž€αžΆαž“αŸ‹αž”αŸ’αž›αž»αž€αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸƒαžœαžαŸ’αžαž» Block αž™αžΎαž„αž’αžΆαž…αž”αŸ†αž”αŸ’αž›αŸ‚αž„αžœαžΆαž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‘αŸ…αž‡αžΆαž‘αž˜αŸ’αžšαž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžαžΆαž˜αž”αžŽαŸ’αžαžΆαž‰ αž“αž·αž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ 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() αž‚αžΊαž‡αžΆαžšαž»αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ db.Cloce() - αž”αžΆαž“αž αŸ…αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž˜αž»αžαž„αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž·αž‘αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αž˜αž»αžαž„αžΆαžšαž€αŸ†αž αž»αžŸ SetTargetBlockHash(hash string) សរសេរ hash αž“αŸƒαž”αŸ’αž›αž»αž€αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž‡αžΆαž˜αž½αž™αž“αžΉαž„ key αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαŸ„αž™ BLOCK_HASH αžαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹ databaseαŸ”

αž˜αž»αžαž„αžΆαžš GetTargetBlockHash() (string, error) αžαŸ’αžšαž‘αž”αŸ‹ hash αž“αŸƒαž”αŸ’αž›αž»αž€αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžŠαŸ‚αž›αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„ databaseαŸ”

αž˜αž»αžαž„αžΆαžšαž€αŸ†αž αž»αžŸ SetTargetBlockHeight(height int) αžŸαžšαžŸαŸαžšαž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αžΌαžœαžαž˜αŸ’αž›αŸƒαž“αŸƒαž€αž˜αŸ’αž–αžŸαŸ‹ blockchain αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΌαž“αžŸαŸ„αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαŸ„αž™ BLOCK_HEIGHT αžαŸαžšαŸ”

αž’αž“αž»αž‚αž˜αž“αŸ GetTargetBlockHeight() (int, error) αžαŸ’αžšαž‘αž”αŸ‹αž€αž˜αŸ’αž–αžŸαŸ‹αž“αŸƒ blockchain αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™ αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αž˜αž»αžαž„αžΆαžš CheckBlock (block IBlock) bool αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αŸ’αž›αž»αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž˜αž»αž“αž–αŸαž›αž”αž“αŸ’αžαŸ‚αž˜αž”αŸ’αž›αž»αž€αž“αŸαŸ‡αž‘αŸ… blockchain αŸ”

αž˜αž»αžαž„αžΆαžšαž€αŸ†αž αž»αžŸ AddBlock (block IBlock) αž”αž“αŸ’αžαŸ‚αž˜αž”αŸ’αž›αž»αž€αž‘αŸ… blockchain αŸ”

αž˜αž»αžαž„αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‘αžΆαž‰αž™αž€ αž“αž·αž„αž˜αžΎαž›αž”αŸ’αž›αž»αž€αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš explore.go αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹ blockchainαŸ–

αž’αž“αž»αž‚αž˜αž“αŸ GetBlockByHash(hash string) (*block.Block, error) αž”αž„αŸ’αž€αžΎαžαžœαžαŸ’αžαž»αž”αŸ’αž›αž»αž€αž‘αž‘αŸ αž•αŸ’αž‘αž»αž€αž”αŸ’αž›αž»αž€αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž–αžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αžœαžΆ αž αžΎαž™αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ’αžšαž“αž·αž…αž‘αŸ…αžœαžΆαŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αŸ’αž›αž»αž€ genesis αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž˜αž»αžαž„αžΆαžšαž€αŸ†αž αž»αžŸ Genesis() αž–αžΈαž―αž€αžŸαžΆαžš genesis.go αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹ blockchain αŸ”

αž’αžαŸ’αžαž”αž‘αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž’αžαž·αžαž·αž‡αž“αž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ„αž™αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžš WebSocket αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹