เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ‡ เจ—เฉ‹ เจฌเจฒเจพเจ•เจšเฉˆเจจ เจตเจฟเฉฑเจš เจฌเจฒเจพเจ• เจ…เจคเฉ‡ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจกเจฟเจœเจผเจพเจˆเจจ เจ•เฉ€เจคเจพ

เจ…เฉฐเจค เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฌเจฒเจพเจ•เจšเฉˆเจจ เจจเจพเจฒ เจ–เจคเจฎ เจ•เจฐเจจ เจฒเจˆ เจจเจพ เจ•เจฟ เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ, เจธเจพเจจเฉ‚เฉฐ เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš 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, error) เจตเจฟเจงเฉ€ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ‡เจจเจชเฉเจŸ เจœเฉ‹เฉœเจฆเฉ€ เจนเฉˆเฅค

AddTxOut(value int, data []byte) (*TxOut, error) เจตเจฟเจงเฉ€ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจœเฉ‹เฉœเจฆเฉ€ เจนเฉˆเฅค

ToBytes() []เจฌเจพเจˆเจŸ เจตเจฟเจงเฉ€ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจฌเจพเจˆเจŸ เจธเจฒเจพเจˆเจธ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค

เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจซเฉฐเจ•เจธเจผเจจ preByteHash(bytes []byte) เจธเจŸเฉเจฐเจฟเฉฐเจ— เจจเฉ‚เฉฐ JavaScript เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจคเฉ‹เจ‚ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจนเฉˆเจธเจผ เจฆเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ 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 เจนเฉˆเฅค

เจฌเจฒเจพเจ•เจนเจพเจˆเจŸ เจฌเจฒเจพเจ• เจฆเฉ€ เจ‰เจšเจพเจˆ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
เจŸเจพเจˆเจฎเจธเจŸเฉˆเจ‚เจช เจŸเจพเจˆเจฎเจธเจŸเฉˆเจ‚เจชเฅค
HeaderSize เจฌเจพเจˆเจŸ เจตเจฟเฉฑเจš เจฌเจฒเจพเจ• เจฆเจพ เจ†เจ•เจพเจฐ เจนเฉˆเฅค
PrevBlockHash เจชเจฟเจ›เจฒเฉ‡ เจฌเจฒเจพเจ• เจฆเจพ เจนเฉˆเจธเจผ เจนเฉˆ, เจ…เจคเฉ‡ SelfBlockHash เจฎเฉŒเจœเฉ‚เจฆเจพ เจ‡เฉฑเจ• เจฆเจพ เจนเฉˆเจธเจผ เจนเฉˆเฅค
TxsHash เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจฆเจพ เจ‡เฉฑเจ• เจ†เจฎ เจนเฉˆเจธเจผ เจนเฉˆเฅค
MerkleRoot Merkle เจฐเฉเฉฑเจ– เจฆเฉ€ เจœเฉœเฉเจน เจนเฉˆ.

เจนเฉ‹เจฐ เจ–เฉ‡เจคเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจฒเจพเจ• เจฆเฉ‡ เจธเจฟเจฐเจœเจฃเจนเจพเจฐ เจฆเฉ€ เจœเจจเจคเจ• เจ•เฉเฉฐเจœเฉ€, เจธเจฟเจฐเจœเจฃเจนเจพเจฐ เจฆเฉ‡ เจฆเจธเจคเจ–เจค, เจฌเจฒเจพเจ• เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ, เจฌเจฒเจพเจ• เจตเจฟเฉฑเจš เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ†, เจ…เจคเฉ‡ เจ‡เจน เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจ–เฉเจฆ เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค

เจ†เจ“ เจ‡เจธเจฆเฉ‡ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ:
เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, 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() เจตเจฟเจงเฉ€ เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจตเจฟเฉฑเจš เจฒเฉˆเจฃ-เจฆเฉ‡เจฃ เจฒเจˆ Merkle เจŸเฉเจฐเฉ€ เจฆเฉ€ เจœเฉœเฉเจน เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆเฅค

เจธเจพเจˆเจจ (privk เจธเจคเจฐ) เจตเจฟเจงเฉ€ เจฌเจฒเจพเจ• เจธเจฟเจฐเจœเจฃเจนเจพเจฐ เจฆเฉ€ เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ เจ•เฉเฉฐเจœเฉ€ เจจเจพเจฒ เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจจเฉ‚เฉฐ เจธเจพเจˆเจจ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค

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(เจนเฉˆเจธเจผ เจธเจŸเฉเจฐเจฟเฉฐเจ—) เจเจฐเจฐ เจซเฉฐเจ•เจธเจผเจจ เจฎเฉŒเจœเฉ‚เจฆเจพ เจฌเจฒเจพเจ• เจฆเฉ‡ เจนเฉˆเจธเจผ เจจเฉ‚เฉฐ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจฒเจˆ BLOCK_HASH เจธเจฅเจฟเจฐ เจฆเฉเจ†เจฐเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉเฉฐเจœเฉ€ เจจเจพเจฒ เจฒเจฟเจ–เจฆเจพ เจนเฉˆเฅค

GetTargetBlockHash() (เจธเจŸเจฐเจฟเฉฐเจ—, เจเจฐเจฐ) เจซเฉฐเจ•เจธเจผเจจ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจฌเจฒเจพเจ• เจฆเจพ เจนเฉˆเจธเจผ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

SetTargetBlockHeight(height int) เจเจฐเจฐ เจซเฉฐเจ•เจธเจผเจจ BLOCK_HEIGHT เจธเจฅเจฟเจฐเจพเจ‚เจ• เจฆเฉเจ†เจฐเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉเฉฐเจœเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจจเฉ‹เจก เจฒเจˆ เจฌเจฒเจพเจ•เจšเฉˆเจจ เจ‰เจšเจพเจˆ เจฆเจพ เจฎเฉเฉฑเจฒ เจกเจพเจŸเจพเจฌเฉ‡เจธ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฆเจพ เจนเฉˆเฅค

GetTargetBlockHeight() (int, error) เจซเฉฐเจ•เจธเจผเจจ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ‡ เจ—เจ เจจเฉ‹เจก เจฒเจˆ เจฌเจฒเจพเจ•เจšเฉˆเจจ เจฆเฉ€ เจ‰เจšเจพเจˆ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจšเฉˆเฉฑเจ•เจฌเจฒเจพเจ• (เจฌเจฒเจพเจ• IBlock) เจฌเฉ‚เจฒ เจซเฉฐเจ•เจธเจผเจจ เจฌเจฒเจพเจ•เจšเฉˆเจจ เจตเจฟเฉฑเจš เจ‡เจธ เจฌเจฒเจพเจ• เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจฆเฉ€ เจธเจผเฉเฉฑเจงเจคเจพ เจฒเจˆ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจเจกเจฌเจฒเจพเจ• (เจฌเจฒเจพเจ• IBlock) เจ—เจฒเจคเฉ€ เจซเฉฐเจ•เจธเจผเจจ เจฌเจฒเจพเจ•เจšเฉˆเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจœเฉ‹เฉœเจฆเจพ เจนเฉˆเฅค

เจฌเจฒเจพเจ•เจšเฉˆเจจ เจชเฉˆเจ•เฉ‡เจœ เจฆเฉ€ explore.go เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฌเจฒเจพเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจฎเฉเฉœ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจฆเฉ‡เจ–เจฃ เจฒเจˆ เจซเฉฐเจ•เจธเจผเจจ เจนเจจ:

GetBlockByHash(hash string) (*block.Block, error) เจซเฉฐเจ•เจธเจผเจจ เจ‡เฉฑเจ• เจ–เจพเจฒเฉ€ เจฌเจฒเจพเจ• เจ†เจฌเจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจคเฉ‹เจ‚ เจ‡เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจฒเฉ‹เจก เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจฆเจพ เจนเฉˆเจธเจผ เจ‡เจธ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ‡เฉฑเจ• เจœเฉˆเจจเฉ‡เจธเจฟเจธ เจฌเจฒเจพเจ• เจฆเฉ€ เจฐเจšเจจเจพ เจฌเจฒเจพเจ•เจšเฉˆเจจ เจชเฉˆเจ•เฉ‡เจœ เจฆเฉ€ genesis.go เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ Genesis() เจเจฐเจฐ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจ…เจ—เจฒเจพ เจฒเฉ‡เจ– WebSocket เจตเจฟเจงเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ—เจพเจนเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจจเฉ‹เจก เจจเจพเจฒ เจœเฉ‹เฉœเจจ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเฉ‡เจ—เจพเฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹