เดŽเดจเตเดฑเต† เด—เต‹ เดฌเตเดฒเต‹เด•เตเด•เตโ€Œเดšเต†เดฏเดฟเดจเดฟเตฝ เดฌเตเดฒเต‹เด•เตเด•เตเด•เดณเตเด‚ เด‡เดŸเดชเดพเดŸเตเด•เดณเตเด‚ เดžเดพเตป เดŽเด™เตเด™เดจเต† เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ เดšเต†เดฏเตโ€Œเดคเต

เด†เดคเตเดฏเดจเตเดคเดฟเด•เดฎเดพเดฏเดฟ เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เตโ€Œเดšเต†เดฏเดฟเดจเดฟเตฝ เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต 3 เดชเตเดฐเดงเดพเดจ เด˜เดŸเด•เด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต:

  • เดฌเตเดฒเต‹เด•เตเด•เต เดกเดพเดฑเตเดฑ เด˜เดŸเดจเดฏเตเดŸเต†เดฏเตเด‚ เดฐเต€เดคเดฟเด•เดณเตเดŸเต†เดฏเตเด‚ เดตเดฟเดตเดฐเดฃเด‚
  • เดกเดพเดฑเตเดฑเดพ เด˜เดŸเดจเดฏเตเดŸเต†เดฏเตเด‚ เด‡เดŸเดชเดพเดŸเต เดฐเต€เดคเดฟเด•เดณเตเดŸเต†เดฏเตเด‚ เดตเดฟเดตเดฐเดฃเด‚
  • เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดฌเตเดฒเต‹เด•เตเด•เตเด•เตพ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดตเดฏเตเดŸเต† เดนเดพเดทเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด‰เดฏเดฐเด‚ (เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเต†เดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚) เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดต เด•เดฃเตเดŸเต†เดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจ เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเตป เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ

เดŽเดจเตเดฑเต† เด—เต‹ เดฌเตเดฒเต‹เด•เตเด•เตโ€Œเดšเต†เดฏเดฟเดจเดฟเตฝ เดฌเตเดฒเต‹เด•เตเด•เตเด•เดณเตเด‚ เด‡เดŸเดชเดพเดŸเตเด•เดณเตเด‚ เดžเดพเตป เดŽเด™เตเด™เดจเต† เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ เดšเต†เดฏเตโ€Œเดคเต

เดตเตเดฏเดตเดธเดพเดฏเดคเตเดคเดฟเดจเตเดณเตเดณ เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเดจเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดฒเต‡เด–เดจเดฎเดพเดฃเดฟเดคเต, เด†เดฆเตเดฏเดคเตเดคเต‡เดคเต เด‡เดตเดฟเดŸเต†.

เดˆ เดธเต€เดฐเต€เดธเดฟเดฒเต† เดฎเตเตป เดฒเต‡เด–เดจเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดตเดพเดฏเดจเด•เตเด•เดพเตผ เดŽเดจเตเดจเต‹เดŸเต เดšเต‹เดฆเดฟเดšเตเดš เดšเต‹เดฆเตเดฏเด™เตเด™เตพ เด“เตผเดฎเตเดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด‡เดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต: เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเตป เดกเดพเดฑเตเดฑ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต LevelDB เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดฎเดฑเตเดฑเตŠเดจเตเดจเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เดณเต† เดคเดŸเดฏเตเดจเตเดจเดฟเดฒเตเดฒ, เดชเดฑเดฏเตเด•, 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 เด‡เตปเดชเตเดŸเตเดŸเตเด•เตพ, เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเต เดชเดฐเดพเดฎเตผเดถเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด‡เดŸเดชเดพเดŸเดฟเตปเตเดฑเต† เดนเดพเดทเต, เดˆ เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเดฟเตปเตเดฑเต†เดฏเตเด‚ เดฌเตˆเดฑเตเดฑเตโ€Œเด•เต‹เดกเดฟเตปเตเดฑเต†เดฏเตเด‚ เดŽเดฃเตเดฃเด‚ เดŽเดจเตเดจเดฟเดต เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† TxOut เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเตเด•เตพ เด•เตเดฑเดšเตเดšเต เดฎเต‚เดฒเตเดฏเดตเตเด‚ เดฌเตˆเดฑเตเดฑเตเด•เต‹เดกเตเด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด’เดฐเต เด‡เดŸเดชเดพเดŸเดฟเดจเต เด…เดคเดฟเตปเตเดฑเต† เดกเดพเดฑเตเดฑเดฏเดฟเตฝ เดŽเดจเตเดคเตŠเด•เตเด•เต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดšเต†เดฏเตเดฏเดพเดจเดพเด•เตเดฎเต†เดจเตเดจเต เด‡เดชเตเดชเต‹เตพ เดจเต‹เด•เตเด•เดพเด‚, เด…เดคเดพเดฏเดคเต. เดจเดฎเตเด•เตเด•เต เดฐเต€เดคเดฟเด•เตพ เดจเต‹เด•เตเด•เดพเด‚.

เด’เดฐเต เด‡เดŸเดชเดพเดŸเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป, เด‡เดŸเดชเดพเดŸเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•.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) เดธเตเดŸเตเดฐเดฟเด‚เด—เต, JavaScript เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดœเดจเดฑเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เดŸเตเดฐเดพเตปเดธเดพเด•เตเดทเตป เดนเดพเดทเตเด•เตพเด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, Build() เดฒเตเด‚ Check() เดŽเดจเตเดจเดฟเดตเดฏเดฟเดฒเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.

Build() เดฐเต€เดคเดฟ เดŸเตเดฐเดพเตปเดธเดพเด•เตเดทเตป เดนเดพเดทเดฟเดจเต† เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเดจเตเดจเต: tx.TxHash = preByteHash(tx.ToBytes()).

ToJSON() เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดฐเต€เดคเดฟ เด’เดฐเต เด‡เดŸเดชเดพเดŸเดฟเดจเต† JSON เดธเตเดŸเตเดฐเดฟเด‚เด—เดพเด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเต.

FromJSON(data []byte) เดชเดฟเดถเด•เต เดฐเต€เดคเดฟ เด’เดฐเต เดฌเตˆเดฑเตเดฑเต เดธเตเดฒเตˆเดธเดพเดฏเดฟ เด•เตˆเดฎเดพเดฑเดฟเดฏ JSON เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด‡เดŸเดชเดพเดŸเต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดšเต†เด•เตเด•เต() เดฌเต‚เตพ เดฐเต€เดคเดฟ, เดŸเตเดฐเดพเตปเดธเดพเด•เตเดทเตป เดนเดพเดทเต เดซเต€เตฝเดกเดฟเตฝ เดจเดฟเดจเตเดจเต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจ เดนเดพเดทเดฟเดจเต† เดˆ เด‡เดŸเดชเดพเดŸเต เดนเดพเดทเดฟเด‚เด—เต เดšเต†เดฏเตเดคเดคเดฟเตปเตเดฑเต† เดซเดฒเดฎเดพเดฏเดฟ เดฒเดญเดฟเดšเตเดš เดนเดพเดทเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต (เดนเดพเดทเต เดซเต€เตฝเดกเต เด…เดตเด—เดฃเดฟเดšเตเดšเต).

เด‡เดŸเดชเดพเดŸเตเด•เตพ เดฌเตเดฒเต‹เด•เตเด•เดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเดคเตเดคเต: 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 เดŽเดจเตเดจเดคเต เด‡เดŸเดชเดพเดŸเตเด•เดณเตเดŸเต† เด’เดฐเต เดชเตŠเดคเต เดนเดพเดทเดพเดฃเต.
เดฎเต†เตผเด•เตเด•เตฝ เดฎเดฐเดคเตเดคเดฟเตปเตเดฑเต† เดตเต‡เดฐเดพเดฃเต เดฎเต†เตผเด•เตเด•เตฝ เดฑเต‚เดŸเตเดŸเต.

เดซเต€เตฝเดกเตเด•เดณเดฟเตฝ เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดธเตเดฐเดทเตเดŸเดพเดตเดฟเตปเตเดฑเต† เดชเตŠเดคเต เด•เต€, เดธเตเดฐเดทเตเดŸเดพเดตเดฟเตปเตเดฑเต† เด’เดชเตเดชเต, เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดชเดคเดฟเดชเตเดชเต, เดฌเตเดฒเต‹เด•เตเด•เดฟเดฒเต† เด‡เดŸเดชเดพเดŸเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚, เดˆ เด‡เดŸเดชเดพเดŸเตเด•เตพ เดŽเดจเตเดจเดฟเดตเดฏเตเดฃเตเดŸเต.

เด…เดคเดฟเตปเตเดฑเต† เดฐเต€เดคเดฟเด•เตพ เดจเต‹เด•เตเด•เดพเด‚:
เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดฌเตเดฒเต‹เด•เตเด•เต.NewBlock() เดซเด‚เด—เตโ€Œเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•: NewBlock(prevBlockHash เดธเตเดŸเตเดฐเดฟเด‚เด—เต, เด‰เดฏเดฐเด‚ int) *เดฌเตเดฒเต‹เด•เตเด•เต, เด‡เดคเต เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเดจเดฟเตฝ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดš เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดฎเตเตป เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดนเดพเดทเตเด‚ เด‰เดฏเดฐเด‚ เดธเต†เดฑเตเดฑเตเด‚ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต. เดคเดฐเด‚ เดชเดพเด•เตเด•เต‡เดœเต เดธเตเดฅเดฟเดฐเดพเด™เตเด•เดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เดฌเตเดฒเต‹เด•เตเด•เต เดคเดฐเดตเตเด‚ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต:

b.DataType = types.BLOCK_TYPE.

AddTx(tx *transaction.TX) เดฐเต€เดคเดฟ เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เด‡เดŸเดชเดพเดŸเต เดšเต‡เตผเด•เตเด•เตเดจเตเดจเต.

เดฌเดฟเตฝเดกเต () เดฐเต€เดคเดฟ เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดซเต€เตฝเดกเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เด…เดคเดฟเตปเตเดฑเต† เดจเดฟเดฒเดตเดฟเดฒเต† เดนเดพเดทเต เดœเดจเดฑเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

ToBytesHeader() []เดฌเตˆเดฑเตเดฑเต เดฐเต€เดคเดฟ เดฌเตเดฒเต‹เด•เตเด•เต เดคเดฒเด•เตเด•เต†เดŸเตเดŸเดฟเดจเต† (เด‡เดŸเดชเดพเดŸเตเด•เดณเดฟเดฒเตเดฒเดพเดคเต†) เด’เดฐเต เดฌเตˆเดฑเตเดฑเต เดธเตเดฒเตˆเดธเดพเด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเต.

ToJSON() เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดฐเต€เดคเดฟ เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด’เดฐเต เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดชเตเดฐเดพเดคเดฟเดจเดฟเดงเตเดฏเดคเตเดคเดฟเตฝ เดฌเตเดฒเต‹เด•เตเด•เดฟเดจเต† JSON เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

FromJSON(data []byte) เดชเดฟเดถเด•เต เดฐเต€เดคเดฟ JSON-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑ เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เด˜เดŸเดจเดฏเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดšเต†เด•เตเด•เต() เดฌเต‚เตพ เดฐเต€เดคเดฟ เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดนเดพเดทเต เดœเดจเดฑเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดฌเตเดฒเต‹เด•เตเด•เต เดนเดพเดทเต เดซเต€เตฝเดกเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

GetTxsHash() เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดฐเต€เดคเดฟ เดฌเตเดฒเต‹เด•เตเด•เดฟเดฒเต† เดŽเดฒเตเดฒเดพ เด‡เดŸเดชเดพเดŸเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดฎเตŠเดคเตเดคเด‚ เดนเดพเดทเต เดจเตฝเด•เตเดจเตเดจเต.

GetMerkleRoot() เดฐเต€เดคเดฟ เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เดฟเดฒเต† เด‡เดŸเดชเดพเดŸเตเด•เตพเด•เตเด•เดพเดฏเดฟ Merkle เดŸเตเดฐเต€เดฏเตเดŸเต† เดฑเต‚เดŸเตเดŸเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต.

Sign(privk string) เดฐเต€เดคเดฟ เดฌเตเดฒเต‹เด•เตเด•เต เดธเตเดฐเดทเตเดŸเดพเดตเดฟเตปเตเดฑเต† เดธเตเดตเด•เดพเดฐเตเดฏ เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดธเตˆเตป เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

SetHeight(height int) เดฐเต€เดคเดฟ เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เด‰เดฏเดฐเด‚ เดฌเตเดฒเต‹เด•เตเด•เต เด˜เดŸเดจ เดซเต€เตฝเดกเดฟเดฒเต‡เด•เตเด•เต เดŽเดดเตเดคเตเดจเตเดจเต.

GetHeight() int เดฐเต€เดคเดฟ เดฌเตเดฒเต‹เด•เตเด•เต เด˜เดŸเดจเดฏเตเดŸเต† เด…เดจเตเดฌเดจเตเดง เดซเต€เตฝเดกเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เด‰เดฏเดฐเด‚ เดจเตฝเด•เตเดจเตเดจเต.

ToGOBBytes() []เดฌเตˆเดฑเตเดฑเต เดฐเต€เดคเดฟ GOB เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดŽเตปเด•เต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เด…เดคเต เด’เดฐเต เดฌเตˆเดฑเตเดฑเต เดธเตเดฒเตˆเดธเดพเดฏเดฟ เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

FromGOBBytes(data []byte) เดชเดฟเดถเด•เต เดฐเต€เดคเดฟ GOB เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดชเดพเดธเตเดธเดพเด•เตเด•เดฟเดฏ เดฌเตˆเดฑเตเดฑเต เดธเตเดฒเตˆเดธเดฟเตฝ เดจเดฟเดจเตเดจเต เดฌเตเดฒเต‹เด•เตเด•เต เด˜เดŸเดจเดฏเดฟเดฒเต‡เด•เตเด•เต เดฌเตเดฒเต‹เด•เตเด•เต เดกเดพเดฑเตเดฑ เดŽเดดเตเดคเตเดจเตเดจเต.

GetHash() เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดฐเต€เดคเดฟ เดคเดจเตเดจเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดนเดพเดทเต เดจเตฝเด•เตเดจเตเดจเต.

GetPrevHash() เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดฐเต€เดคเดฟ เดฎเตเดฎเตเดชเดคเตเดคเต† เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดนเดพเดทเต เดจเตฝเด•เตเดจเตเดจเต.

SetPublicKey(pubk string) เดฐเต€เดคเดฟ เดฌเตเดฒเต‹เด•เตเด•เต เดธเตเดฐเดทเตเดŸเดพเดตเดฟเตปเตเดฑเต† เดชเตŠเดคเต เด•เต€ เดฌเตเดฒเต‹เด•เตเด•เดฟเดฒเต‡เด•เตเด•เต เดŽเดดเตเดคเตเดจเตเดจเต.

เด…เด™เตเด™เดจเต†, เดฌเตเดฒเต‹เด•เตเด•เต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเดฟเตปเตเดฑเต† เดฐเต€เดคเดฟเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเดฒเต‚เดŸเต† เดธเด‚เดชเตเดฐเต‡เดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดฒเต†เดตเตฝเดกเดฟเดฌเดฟ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต‡เด•เตเด•เต เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด’เดฐเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดจเดฎเตเด•เตเด•เต เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚.

เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเดจเดฟเดฒเต‡เด•เตเด•เต เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเตป เดชเดพเด•เตเด•เต‡เดœเดฟเตปเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเด•เดณเดพเดฃเต: 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) เดชเดฟเดถเด•เต เดซเด‚เด—เตเดทเตป เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต‡เด•เตเด•เต BLOCK_HASH เดธเตเดฅเดฟเดฐเดพเด™เตเด•เด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเดฒเดตเดฟเดฒเต† เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดนเดพเดทเต เดŽเดดเตเดคเตเดจเตเดจเต.

GetTargetBlockHash() (เดธเตเดŸเตเดฐเดฟเด‚เด—เต, เดชเดฟเดถเด•เต) เดซเด‚เด—เตเดทเตป เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดจเดฟเดฒเดตเดฟเดฒเต† เดฌเตเดฒเต‹เด•เตเด•เดฟเตปเตเดฑเต† เดนเดพเดทเต เดจเตฝเด•เตเดจเตเดจเต.

SetTargetBlockHeight(height int) เดชเดฟเดถเด•เต เดซเด‚เด—เตเดทเตป, BLOCK_HEIGHT เดธเตเดฅเดฟเดฐเดพเด™เตเด•เด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏ เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเต‹เดกเดฟเดจเตเดณเตเดณ เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเตป เด‰เดฏเดฐเดคเตเดคเดฟเตปเตเดฑเต† เดฎเต‚เดฒเตเดฏเด‚ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต‡เด•เตเด•เต เดŽเดดเตเดคเตเดจเตเดจเต.

GetTargetBlockHeight() (int, error) เดซเด‚เด—เตโ€Œเดทเตป, เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดธเด‚เดญเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดจเต‹เดกเดฟเดจเดพเดฏเดฟ เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเดจเดฟเตปเตเดฑเต† เด‰เดฏเดฐเด‚ เดจเตฝเด•เตเดจเตเดจเต.

เดšเต†เด•เตเด•เตเดฌเตเดฒเต‹เด•เตเด•เต(เดฌเตเดฒเต‹เด•เตเด•เต เดเดฌเตเดฒเต‹เด•เตเด•เต) เดฌเต‚เตพ เดซเด‚เด—เตเดทเตป เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเดจเดฟเดฒเต‡เด•เตเด•เต เดˆ เดฌเตเดฒเต‹เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดถเดฐเดฟเดฏเดพเดฃเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต.

AddBlock(block IBlock) เดชเดฟเดถเด•เต เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดฌเตเดฒเต‹เด•เตเด•เตเดšเต†เดฏเดฟเดจเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเดจเตเดจเต.

เดฌเตเดฒเต‹เด•เตเด•เตเด•เตพ เดตเต€เดฃเตเดŸเต†เดŸเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เดพเดฃเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ blockchain เดชเดพเด•เตเด•เต‡เดœเดฟเตปเตเดฑเต† explore.go เดซเดฏเดฒเดฟเดฒเตเดฃเตเดŸเต:

GetBlockByHash(hash string) (*block.Block, error) เดซเด‚เด—เตโ€Œเดทเตป เด’เดฐเต เดถเต‚เดจเตเดฏเดฎเดพเดฏ เดฌเตเดฒเต‹เด•เตเด•เต เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเต, เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดคเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดคเดฟเตปเตเดฑเต† เดนเดพเดทเต เด…เดคเดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเดฟ, เด…เดคเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดชเต‹เดฏเดฟเตปเตเดฑเตผ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเต.

เดฌเตเดฒเต‹เด•เตเด•เตโ€Œเดšเต†เดฏเดฟเตป เดชเดพเด•เตเด•เต‡เดœเดฟเตปเตเดฑเต† genesis.go เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ Genesis() เดชเดฟเดถเด•เต เดซเด‚เด—เตโ€Œเดทเตป เดตเดดเดฟเดฏเดพเดฃเต เด’เดฐเต เดœเดจเดฟเดคเด• เดฌเตเดฒเต‹เด•เตเด•เต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต.

WebSocket เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดจเต‹เดกเดฟเดฒเต‡เด•เตเด•เต เด•เตเดฒเดฏเตปเตเดฑเตเด•เดณเต† เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด…เดŸเตเดคเตเดค เดฒเต‡เด–เดจเด‚ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•