āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻŋ āĻ†āĻŽāĻžāĻ° āĻ—ā§‹ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻŦā§āĻ˛āĻ• āĻāĻŦāĻ‚ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°ā§‡āĻ›āĻŋ

āĻļā§‡āĻˇ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻļā§‡āĻˇ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻ¨āĻ¯āĻŧ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡ 3āĻŸāĻŋ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡:

  • āĻŦā§āĻ˛āĻ• āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻšāĻžāĻ° āĻāĻŦāĻ‚ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž
  • āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻšāĻžāĻ° āĻāĻŦāĻ‚ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž
  • āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻŦā§āĻ˛āĻ• āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻšā§āĻ¯āĻžāĻļ āĻŦāĻž āĻ‰āĻšā§āĻšāĻ¤āĻž (āĻŦāĻž āĻ…āĻ¨ā§āĻ¯ āĻ•āĻŋāĻ›ā§) āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ–ā§āĻāĻœā§‡ āĻĒāĻžāĻ¯āĻŧāĨ¤

āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻŋ āĻ†āĻŽāĻžāĻ° āĻ—ā§‹ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻŦā§āĻ˛āĻ• āĻāĻŦāĻ‚ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°ā§‡āĻ›āĻŋ

āĻāĻŸāĻŋ āĻļāĻŋāĻ˛ā§āĻĒā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§, āĻĒā§āĻ°āĻĨāĻŽ āĻāĻ–āĻžāĻ¨ā§‡.

āĻāĻ‡ āĻ¸āĻŋāĻ°āĻŋāĻœā§‡āĻ° āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āĻ¤ā§€ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻĒāĻžāĻ āĻ•āĻ°āĻž āĻ†āĻŽāĻžāĻ•ā§‡ āĻ¯ā§‡ āĻĒā§āĻ°āĻļā§āĻ¨āĻ—ā§āĻ˛āĻŋ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛ā§‡āĻ¨ āĻ¤āĻž āĻŽāĻ¨ā§‡ āĻ°ā§‡āĻ–ā§‡, āĻāĻŸāĻŋ āĻ˛āĻ•ā§āĻˇ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤: āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ˛ā§‡āĻ­ā§‡āĻ˛āĻĄāĻŋāĻŦāĻŋ āĻĄā§‡āĻŸāĻžāĻŦā§‡āĻ¸ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ āĻĄā§‡āĻŸāĻž āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧ, āĻ¤āĻŦā§‡ āĻ•āĻŋāĻ›ā§āĻ‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨āĻ“ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻŦāĻžāĻ§āĻž āĻĻā§‡āĻ¯āĻŧ āĻ¨āĻž, āĻŦāĻ˛ā§āĻ¨, āĻŽāĻžāĻ‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ā§ˇ āĻāĻ–āĻ¨ āĻāĻ‡ āĻĄā§‡āĻŸāĻžāĻ° āĻ—āĻ āĻ¨ āĻĻā§‡āĻ–āĻŋāĨ¤

āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•: 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 āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻ•āĻŋāĻ›ā§ āĻŽāĻžāĻ¨ āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻŦāĻžāĻ‡āĻŸāĻ•ā§‹āĻĄāĻ“ āĻ°āĻžāĻ–ā§‡āĨ¤

āĻāĻ–āĻ¨ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻ• āĻāĻ•āĻŸāĻŋ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ¤āĻžāĻ° āĻĄā§‡āĻŸāĻžāĻ¤ā§‡ āĻ•ā§€ āĻ•ā§€ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¯ā§‡āĻŽāĻ¨ āĻšāĻ˛ā§āĻ¨ āĻĻā§‡āĻ–ā§‡ āĻ¨ā§‡āĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ—ā§āĻ˛ā§‹āĨ¤

āĻāĻ•āĻŸāĻŋ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡, 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 āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻŸ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§‡āĨ¤

āĻšā§‡āĻ•() āĻŦā§āĻ˛ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻšā§āĻ¯āĻžāĻļ āĻĢāĻŋāĻ˛ā§āĻĄ āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻšā§āĻ¯āĻžāĻļā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ‡ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨āĻŸāĻŋ āĻšā§āĻ¯āĻžāĻļ āĻ•āĻ°āĻžāĻ° āĻĢāĻ˛ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻšā§āĻ¯āĻžāĻļā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¤ā§āĻ˛āĻ¨āĻž āĻ•āĻ°ā§‡ (āĻšā§āĻ¯āĻžāĻļ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻŸāĻŋāĻ•ā§‡ āĻ‰āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡)āĨ¤

āĻŦā§āĻ˛āĻ•ā§‡ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡: 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, āĻ¯āĻž āĻ†āĻ—ā§‡āĻ° āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻšā§āĻ¯āĻžāĻļ āĻ¨ā§‡āĻ¯āĻŧ āĻāĻŦāĻ‚ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻ¤ā§ˆāĻ°āĻŋ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻ‰āĻšā§āĻšāĻ¤āĻžāĨ¤ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻ§āĻ°āĻ¨āĻŸāĻŋ āĻĒā§āĻ°āĻ•āĻžāĻ° āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻ§ā§āĻ°ā§āĻŦāĻ• āĻĨā§‡āĻ•ā§‡āĻ“ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡:

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 āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚) āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ˛āĻ•ā§‡ āĻŦā§āĻ˛āĻ• āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻ¤āĻžāĻ° āĻĒāĻžāĻŦāĻ˛āĻŋāĻ• āĻ•ā§€ āĻ˛āĻŋāĻ–ā§‡āĨ¤

āĻāĻ‡āĻ­āĻžāĻŦā§‡, āĻŦā§āĻ˛āĻ• āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻ¸āĻšāĻœā§‡āĻ‡ āĻāĻŸāĻŋāĻ•ā§‡ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻāĻŦāĻ‚ āĻ˛ā§‡āĻ­ā§‡āĻ˛āĻĄāĻŋāĻŦāĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤

āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœā§‡āĻ° āĻ•āĻžāĻœāĻ—ā§āĻ˛āĻŋ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€: 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) āĻĢāĻžāĻ‚āĻļāĻ¨ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŋāĻ¤ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻ¨ā§‹āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡āĻ° āĻ‰āĻšā§āĻšāĻ¤āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤

CheckBlock(block IBlock) bool āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻāĻ‡ āĻŦā§āĻ˛āĻ• āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻ†āĻ—ā§‡ āĻ¸āĻ āĻŋāĻ•āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡āĨ¤

AddBlock(block IBlock) āĻāĻ°āĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡āĨ¤

āĻŦā§āĻ˛āĻ• āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻāĻŦāĻ‚ āĻĻā§‡āĻ–āĻžāĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœā§‡āĻ° explore.go āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡:

GetBlockByHash(āĻšā§āĻ¯āĻžāĻļ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚) (*block.Block, error) āĻĢāĻžāĻ‚āĻļāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ–āĻžāĻ˛āĻŋ āĻŦā§āĻ˛āĻ• āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡, āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻāĻŸāĻŋāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§‡, āĻ¯āĻžāĻ° āĻšā§āĻ¯āĻžāĻļ āĻāĻŸāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ¸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸāĻžāĻ° āĻĢā§‡āĻ°āĻ¤ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻāĻ•āĻŸāĻŋ āĻœā§‡āĻ¨ā§‡āĻ¸āĻŋāĻ¸ āĻŦā§āĻ˛āĻ• āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻŦā§āĻ˛āĻ•āĻšā§‡āĻ‡āĻ¨ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœā§‡āĻ° genesis.go āĻĢāĻžāĻ‡āĻ˛ āĻĨā§‡āĻ•ā§‡ āĻœā§‡āĻ¨ā§‡āĻ¸āĻŋāĻ¸() āĻāĻ°āĻ° āĻĢāĻžāĻ‚āĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻžāĨ¤

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ WebSocket āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨ā§‹āĻĄā§‡ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸāĻĻā§‡āĻ° āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŦā§‡āĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨