เชฎเซ‡เช‚ เชฎเชพเชฐเชพ เช—เซ‹ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชฎเชพเช‚ เชฌเซเชฒเซ‹เช•เซเชธ เช…เชจเซ‡ เชตเซเชฏเชตเชนเชพเชฐเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชกเชฟเชเชพเช‡เชจ เช•เชฐเซเชฏเชพ

เช†เช–เชฐเซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชธเชพเชฅเซ‡ เชธเชฎเชพเชชเซเชค เชฅเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชกเซ‡เชŸเชพเชฌเซ‡เช เชœ เชจเชนเซ€เช‚, เช…เชฎเชพเชฐเซ‡ เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ 3 เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช˜เชŸเช•เซ‹ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

  • เชฌเซเชฒเซ‹เช• เชกเซ‡เชŸเชพ เชฎเชพเชณเช–เซเช‚ เช…เชจเซ‡ เชชเชฆเซเชงเชคเชฟเช“เชจเซเช‚ เชตเชฐเซเชฃเชจ
  • เชกเซ‡เชŸเชพ เชฎเชพเชณเช–เซเช‚ เช…เชจเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เชชเชฆเซเชงเชคเชฟเช“เชจเซเช‚ เชตเชฐเซเชฃเชจ
  • เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชซเช‚เช•เซเชถเชจเซเชธ เช•เซ‡ เชœเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชฌเซเชฒเซ‹เช•เซเชธเชจเซ‡ เชธเชพเชšเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชคเซ‡เชฎเชจเชพ เชนเซ‡เชถ เช…เชฅเชตเชพ เชŠเช‚เชšเชพเชˆ (เช…เชฅเชตเชพ เชฌเซ€เชœเซเช‚ เช•เช‚เชˆเช•) เชฆเซเชตเชพเชฐเชพ เชคเซเชฏเชพเช‚ เชถเซ‹เชงเซ‡ เช›เซ‡.

เชฎเซ‡เช‚ เชฎเชพเชฐเชพ เช—เซ‹ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชฎเชพเช‚ เชฌเซเชฒเซ‹เช•เซเชธ เช…เชจเซ‡ เชตเซเชฏเชตเชนเชพเชฐเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชกเชฟเชเชพเช‡เชจ เช•เชฐเซเชฏเชพ

เช‰เชฆเซเชฏเซ‹เช— เชฎเชพเชŸเซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชตเชฟเชถเซ‡เชจเซ‹ เช† เชฌเซ€เชœเซ‹ เชฒเซ‡เช– เช›เซ‡, เชชเชนเซ‡เชฒเซ‹ เช…เชนเซ€เช‚.

เช† เชถเซเชฐเซ‡เชฃเซ€เชจเชพ เชชเชพเช›เชฒเชพ เชฒเซ‡เช– เชตเชฟเชถเซ‡ เชตเชพเชšเช•เซ‹เช เชฎเชจเซ‡ เชชเซ‚เช›เซ‡เชฒเชพ เชชเซเชฐเชถเซเชจเซ‹เชจเซ‡ เชฏเชพเชฆ เชฐเชพเช–เซ€เชจเซ‡, เชคเซ‡ เชจเซ‹เช‚เชงเชตเซเช‚ เชœเซ‹เชˆเช: เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฒเซ‡เชตเชฒเชกเซ€เชฌเซ€ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชกเซ‡เชŸเชพเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เช•เชนเซ‹ เช•เซ‡, 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, เชญเซ‚เชฒ) เชชเชฆเซเชงเชคเชฟ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เช‡เชจเชชเซเชŸ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡.

AddTxOut(เชตเซ‡เชฒเซเชฏเซ int, data []byte) (*TxOut, เชเชฐเชฐ) เชชเชฆเซเชงเชคเชฟ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เช†เช‰เชŸเชชเซเชŸ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡.

ToBytes() []เชฌเชพเช‡เชŸ เชชเชฆเซเชงเชคเชฟ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจเชจเซ‡ เชฌเชพเช‡เชŸ เชธเซเชฒเชพเช‡เชธเชฎเชพเช‚ เชซเซ‡เชฐเชตเซ‡ เช›เซ‡.

เช†เช‚เชคเชฐเชฟเช• เชซเช‚เช•เซเชถเชจ preByteHash(bytes []byte) เชธเซเชŸเซเชฐเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— Build() เช…เชจเซ‡ Check() เชฎเชพเช‚ เชฅเชพเชฏ เช›เซ‡ เชœเซ‡เชฅเซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡เชฒ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชนเซ‡เชถ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชฎเชพเช‚เชฅเซ€ เชœเชจเชฐเซ‡เชŸ เชฅเชฏเซ‡เชฒ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชนเซ‡เชถ เชธเชพเชฅเซ‡ เชธเซเชธเช‚เช—เชค เชฌเชจเซ‡.

เชฌเชฟเชฒเซเชก() เชชเชฆเซเชงเชคเชฟ เชจเซ€เชšเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชนเซ‡เชถ เชธเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡: 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 เชฌเซเชฒเซ‹เช•เชจเซ€ เชŠเช‚เชšเชพเชˆเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡.
เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช.
เชนเซ‡เชกเชฐเชธเชพเชˆเช เช เชฌเชพเชˆเชŸเชฎเชพเช‚ เชฌเซเชฒเซ‹เช•เชจเซเช‚ เช•เชฆ เช›เซ‡.
PrevBlockHash เช เชชเชนเซ‡เชฒเชพเชจเชพ เชฌเซเชฒเซ‹เช•เชจเซเช‚ เชนเซ‡เชถ เช›เซ‡, เช…เชจเซ‡ SelfBlockHash เช เชตเชฐเซเชคเชฎเชพเชจเชจเซเช‚ เชนเซ‡เชถ เช›เซ‡.
TxsHash เช เชตเซเชฏเชตเชนเชพเชฐเซ‹เชจเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชนเซ‡เชถ เช›เซ‡.
เชฎเชฐเซเช•เชฒเชฐเซ‚เชŸ เช เชฎเชฐเซเช•เชฒ เชตเซƒเช•เซเชทเชจเซเช‚ เชฎเซ‚เชณ เช›เซ‡.

เช†เช—เชณ เช•เซเชทเซ‡เชคเซเชฐเซ‹เชฎเชพเช‚ เชฌเซเชฒเซ‹เช•เชจเชพ เชจเชฟเชฐเซเชฎเชพเชคเชพเชจเซ€ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เช•เซ€, เชจเชฟเชฐเซเชฎเชพเชคเชพเชจเซ€ เชธเชนเซ€, เชฌเซเชฒเซ‹เช•เชจเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ, เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชตเซเชฏเชตเชนเชพเชฐเซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ เช…เชจเซ‡ เช† เชตเซเชฏเชตเชนเชพเชฐเซ‹ เชชเซ‹เชคเซ‡ เชœ เช›เซ‡.

เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ€ เชชเชฆเซเชงเชคเชฟเช“ เชœเซ‹เชˆเช:
เชฌเซเชฒเซ‹เช• เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, block.NewBlock() เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹: NewBlock(prevBlockHash string, height int) *Block, เชœเซ‡ เชชเชนเซ‡เชฒเชพเชจเชพ เชฌเซเชฒเซ‹เช•เชจเซ€ เชนเซ‡เชถ เชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชฎเชพเช‚ เชฌเชจเชพเชตเซ‡เชฒ เชฌเซเชฒเซ‹เช• เชฎเชพเชŸเซ‡ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒเซ€ เชŠเช‚เชšเชพเชˆ. เชฌเซเชฒเซ‹เช•เชจเซ‹ เชชเซเชฐเช•เชพเชฐ เชชเชฃ เชชเซ‡เช•เซ‡เชœ เช•เซ‹เชจเซเชธเซเชŸเชจเซเชŸเชจเชพ เชชเซเชฐเช•เชพเชฐเซ‹เชฎเชพเช‚เชฅเซ€ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒ เช›เซ‡:

b.DataType = types.BLOCK_TYPE.

AddTx(tx *transaction.TX) เชชเชฆเซเชงเชคเชฟ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡.

เชฌเชฟเชฒเซเชก() เชชเชฆเซเชงเชคเชฟ เชฌเซเชฒเซ‹เช•เชจเชพ เช•เซเชทเซ‡เชคเซเชฐเซ‹เชฎเชพเช‚ เชฎเซ‚เชฒเซเชฏเซ‹ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เชนเซ‡เชถเชจเซ‡ เชœเชจเชฐเซ‡เชŸ เช…เชจเซ‡ เชธเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡.

ToBytesHeader() []เชฌเชพเช‡เชŸ เชชเชฆเซเชงเชคเชฟ เชฌเซเชฒเซ‹เช• เชนเซ‡เชกเชฐเชจเซ‡ (เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชตเชฟเชจเชพ) เชฌเชพเช‡เชŸ เชธเซเชฒเชพเช‡เชธเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

ToJSON() เชธเซเชŸเซเชฐเชฟเช‚เช— เชชเชฆเซเชงเชคเชฟ เชกเซ‡เชŸเชพเชจเชพ เชธเซเชŸเซเชฐเชฟเช‚เช— เชฐเชœเซ‚เช†เชคเชฎเชพเช‚ เชฌเซเชฒเซ‹เช•เชจเซ‡ JSON เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

FromJSON(data []byte) เชญเซ‚เชฒ เชชเชฆเซเชงเชคเชฟ JSON เชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพเชจเซ‡ เชฌเซเชฒเซ‹เช• เชธเซเชŸเซเชฐเช•เซเชšเชฐเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡.

เชšเซ‡เช•() เชฌเซ‚เชฒ เชชเชฆเซเชงเชคเชฟ เชฌเซเชฒเซ‹เช• เชนเซ‡เชถ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฌเซเชฒเซ‹เช• เชนเซ‡เชถ เชซเซ€เชฒเซเชกเชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชธเชพเชฅเซ‡ เชคเซ‡เชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ‡ เช›เซ‡.

GetTxsHash() เชธเซเชŸเซเชฐเชฟเช‚เช— เชชเชฆเซเชงเชคเชฟ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚เชจเชพ เชคเชฎเชพเชฎ เชตเซเชฏเชตเชนเชพเชฐเซ‹เชจเซ€ เช•เซเชฒ เชนเซ‡เชถ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

GetMerkleRoot() เชชเชฆเซเชงเชคเชฟ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชตเซเชฏเชตเชนเชพเชฐเซ‹ เชฎเชพเชŸเซ‡ เชฎเชฐเซเช•เชฒ เชŸเซเชฐเซ€เชจเชพ เชฎเซ‚เชณเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡.

เชธเชพเช‡เชจ (เชชเซเชฐเชฟเชตเช•เซ‡ เชธเซเชŸเซเชฐเชฟเช‚เช—) เชชเชฆเซเชงเชคเชฟ เชฌเซเชฒเซ‹เช• เชจเชฟเชฐเซเชฎเชพเชคเชพเชจเซ€ เช–เชพเชจเช—เซ€ เช•เซ€ เชตเชกเซ‡ เชฌเซเชฒเซ‹เช• เชชเชฐ เชธเชนเซ€ เช•เชฐเซ‡ เช›เซ‡.

SetHeight(height int) เชชเชฆเซเชงเชคเชฟ เชฌเซเชฒเซ‹เช• เชธเซเชŸเซเชฐเช•เซเชšเชฐ เชซเซ€เชฒเซเชกเชฎเชพเช‚ เชฌเซเชฒเซ‹เช•เชจเซ€ เชŠเช‚เชšเชพเชˆ เชฒเช–เซ‡ เช›เซ‡.

GetHeight() int เชฎเซ‡เชฅเชก เชฌเซเชฒเซ‹เช• เชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเชพ เช…เชจเซเชฐเซ‚เชช เชซเซ€เชฒเซเชกเชฎเชพเช‚ เชธเซเชชเชทเซเชŸ เช•เชฐเซเชฏเชพ เชฎเซเชœเชฌ เชฌเซเชฒเซ‹เช•เชจเซ€ เชŠเช‚เชšเชพเชˆ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

ToGOBBytes() []เชฌเชพเชˆเชŸ เชชเชฆเซเชงเชคเชฟ GOB เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชฌเซเชฒเซ‹เช•เชจเซ‡ เชเชจเซเช•เซ‹เชก เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฌเชพเชˆเชŸ เชธเซเชฒเชพเชˆเชธ เชคเชฐเซ€เช•เซ‡ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

FromGOBBytes(data []byte) เชเชฐเชฐ เชฎเซ‡เชฅเชก GOB เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชชเชพเชธ เช•เชฐเซ‡เชฒ เชฌเชพเชˆเชŸ เชธเซเชฒเชพเชˆเชธเชฎเชพเช‚เชฅเซ€ เชฌเซเชฒเซ‹เช• เชธเซเชŸเซเชฐเช•เซเชšเชฐเชฎเชพเช‚ เชฌเซเชฒเซ‹เช• เชกเซ‡เชŸเชพ เชฒเช–เซ‡ เช›เซ‡.

GetHash() เชธเซเชŸเซเชฐเชฟเช‚เช— เชชเชฆเซเชงเชคเชฟ เช†เชชเซ‡เชฒ เชฌเซเชฒเซ‹เช•เชจเซ€ เชนเซ‡เชถ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

GetPrevHash() เชธเซเชŸเซเชฐเชฟเช‚เช— เชชเชฆเซเชงเชคเชฟ เช…เช—เชพเช‰เชจเชพ เชฌเซเชฒเซ‹เช•เชจเซ€ เชนเซ‡เชถ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

SetPublicKey(pubk เชธเซเชŸเซเชฐเชฟเช‚เช—) เชชเชฆเซเชงเชคเชฟ เชฌเซเชฒเซ‹เช• เชจเชฟเชฐเซเชฎเชพเชคเชพเชจเซ€ เชœเชพเชนเซ‡เชฐ เช•เซ€เชจเซ‡ เชฌเซเชฒเซ‹เช• เชชเชฐ เชฒเช–เซ‡ เช›เซ‡.

เช†เชฎ, เชฌเซเชฒเซ‹เช• เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เช…เชจเซ‡ เชฒเซ‡เชตเชฒเชกเซ€เชฌเซ€ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชธเชพเชšเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช.

เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเซ‡เช•เซ‡เชœเชจเชพ เช•เชพเชฐเซเชฏเซ‹ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชฎเชพเช‚ เชฌเชšเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡: 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) เชเชฐเชฐ เชซเช‚เช•เซเชถเชจ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชฎเชพเช‚ เชฌเซเชฒเซ‹เช• เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡.

เชฌเซเชฒเซ‹เช•เซเชธ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เช…เชจเซ‡ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡เชจเชพเช‚ เช•เชพเชฐเซเชฏเซ‹ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเซ‡เช•เซ‡เชœเชจเซ€ explore.go เชซเชพเช‡เชฒเชฎเชพเช‚ เช›เซ‡:

GetBlockByHash(hash string) (*block.Block, error) เชซเช‚เช•เซเชถเชจ เชเช• เช–เชพเชฒเซ€ เชฌเซเชฒเซ‹เช• เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ‡ เช›เซ‡, เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚เชฅเซ€ เชคเซ‡เชฎเชพเช‚ เชเช• เชฌเซเชฒเซ‹เช• เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชนเซ‡เชถ เชคเซ‡เชจเซ‡ เชชเชธเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹, เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชเช• เชชเซ‹เช‡เชจเซเชŸเชฐ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเซ‡เช•เซ‡เชœเชจเซ€ genesis.go เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ Genesis() เชเชฐเชฐ เชซเช‚เช•เซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชœเชฟเชจเซ‡เชธเชฟเชธ เชฌเซเชฒเซ‹เช•เชจเซเช‚ เชจเชฟเชฐเซเชฎเชพเชฃ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช†เช—เชณเชจเซ‹ เชฒเซ‡เช– WebSocket เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซเชฒเชพเชฏเช‚เชŸเชจเซ‡ เชจเซ‹เชก เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชถเซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹