แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒžแƒ แƒแƒ”แƒฅแƒขแƒ” แƒ‘แƒšแƒแƒ™แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒฉแƒ”แƒ›แƒก Go blockchain-แƒจแƒ˜

แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒกแƒแƒ‘แƒแƒšแƒแƒแƒ“ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ— แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒ˜ แƒ“แƒ แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ, แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— 3 แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜ แƒฉแƒ•แƒ”แƒœแƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒก:

  • แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ
  • แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒกแƒ แƒ“แƒ แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ
  • แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒ‘แƒšแƒแƒ™แƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒ“แƒ แƒžแƒแƒฃแƒšแƒแƒ‘แƒก แƒ›แƒแƒ— แƒฐแƒ”แƒจแƒ˜แƒก แƒแƒœ แƒกแƒ˜แƒ›แƒแƒฆแƒšแƒ˜แƒก (แƒแƒœ แƒกแƒฎแƒ•แƒ แƒ แƒแƒ›แƒ˜แƒก) แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—.

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒแƒžแƒ แƒแƒ”แƒฅแƒขแƒ” แƒ‘แƒšแƒแƒ™แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒฉแƒ”แƒ›แƒก Go blockchain-แƒจแƒ˜

แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ›แƒ”แƒแƒ แƒ” แƒกแƒขแƒแƒขแƒ˜แƒ แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ˜แƒœแƒ“แƒฃแƒกแƒขแƒ แƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒแƒฅ.

แƒ’แƒแƒ•แƒ˜แƒฎแƒกแƒ”แƒœแƒแƒ— แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ›แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒšแƒ”แƒ‘แƒ›แƒ แƒ“แƒแƒ›แƒ˜แƒกแƒ•แƒ”แƒก แƒแƒ› แƒกแƒ”แƒ แƒ˜แƒ˜แƒก แƒฌแƒ˜แƒœแƒ แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒฃแƒœแƒ“แƒ แƒแƒฆแƒ˜แƒœแƒ˜แƒจแƒœแƒแƒก: แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, 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, แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ) แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ›แƒแƒขแƒ”แƒ‘แƒก แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒแƒก.

AddTxOut(แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ int, data []byte) (*TxOut, แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ) แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ›แƒแƒขแƒ”แƒ‘แƒก แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒก แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒแƒก.

ToBytes() []byte แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒฅแƒชแƒ”แƒ•แƒก แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒแƒก แƒ‘แƒแƒ˜แƒขแƒ˜แƒก แƒœแƒแƒญแƒ”แƒ แƒแƒ“.

แƒจแƒ˜แƒ“แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก preByteHash(bytes []byte) แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ Build() แƒ“แƒ Check()-แƒจแƒ˜, แƒ แƒแƒ—แƒ แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒฐแƒ”แƒจแƒ˜ แƒ˜แƒงแƒแƒก แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜ JavaScript แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒขแƒ แƒแƒœแƒกแƒแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒฐแƒ”แƒจแƒ”แƒ‘แƒ—แƒแƒœ.

Build() แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ“แƒ’แƒ”แƒœแƒก แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒฐแƒ”แƒจแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒœแƒแƒ˜แƒ แƒแƒ“: tx.TxHash = preByteHash(tx.ToBytes()).

ToJSON() string แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ’แƒแƒ แƒ“แƒแƒฅแƒ›แƒœแƒ˜แƒก แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒแƒก JSON แƒกแƒขแƒ แƒ˜แƒœแƒ’แƒแƒ“.

FromJSON(data []byte) แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒก แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒแƒก JSON แƒคแƒแƒ แƒ›แƒแƒขแƒ˜แƒ“แƒแƒœ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜แƒ แƒ‘แƒแƒ˜แƒขแƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒแƒ“.

Check() bool แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ“แƒแƒ แƒ”แƒ‘แƒก แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒฐแƒ”แƒจแƒ˜แƒก แƒ•แƒ”แƒšแƒ˜แƒ“แƒแƒœ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒš แƒฐแƒ”แƒจแƒก แƒแƒ› แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒฐแƒ”แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒš แƒฐแƒ”แƒจแƒก (แƒฐแƒ”แƒจแƒ˜แƒก แƒ•แƒ”แƒšแƒ˜แƒก แƒ˜แƒ’แƒœแƒแƒ แƒ˜แƒ แƒ”แƒ‘แƒ).

แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ แƒ‘แƒšแƒแƒ™แƒก: 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 แƒแƒ แƒ˜แƒก แƒ›แƒ”แƒ แƒ™แƒšแƒ˜แƒก แƒฎแƒ˜แƒก แƒคแƒ”แƒกแƒ•แƒ˜.

แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒ•แƒ”แƒšแƒ”แƒ‘แƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒจแƒ”แƒ›แƒฅแƒ›แƒœแƒ”แƒšแƒ˜แƒก แƒกแƒแƒฏแƒแƒ แƒ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜, แƒจแƒ”แƒ›แƒฅแƒ›แƒœแƒ”แƒšแƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒแƒฌแƒ”แƒ แƒ, แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ, แƒ‘แƒšแƒแƒ™แƒจแƒ˜ แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ“แƒ แƒ—แƒแƒ•แƒแƒ“ แƒ”แƒก แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜.

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ›แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒก:
แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— block.NewBlock() แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ: NewBlock(prevBlockHash string, height int) *Block, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒฆแƒ”แƒ‘แƒก แƒฌแƒ˜แƒœแƒ แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒฐแƒ”แƒจแƒก แƒ“แƒ แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒจแƒ˜ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒ‘แƒšแƒแƒ™แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒš แƒกแƒ˜แƒ›แƒแƒฆแƒšแƒ”แƒก. แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒขแƒ˜แƒžแƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒขแƒ˜แƒžแƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒ˜แƒ“แƒแƒœ:

b.DataType = types.BLOCK_TYPE.

AddTx(tx *transaction.TX) แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ›แƒแƒขแƒ”แƒ‘แƒก แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒแƒก แƒ‘แƒšแƒแƒ™แƒจแƒ˜.

Build() แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒ•แƒ”แƒšแƒ”แƒ‘แƒจแƒ˜ แƒ“แƒ แƒฅแƒ›แƒœแƒ˜แƒก แƒ“แƒ แƒแƒ“แƒ’แƒ”แƒœแƒก แƒ›แƒ˜แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒฐแƒ”แƒจแƒก.

ToBytesHeader() []byte แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ’แƒแƒ แƒ“แƒแƒฅแƒ›แƒœแƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒก (แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”) แƒ‘แƒแƒ˜แƒขแƒ˜แƒก แƒœแƒแƒญแƒ”แƒ แƒแƒ“.

ToJSON() แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ’แƒแƒ แƒ“แƒแƒฅแƒ›แƒœแƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒก JSON แƒคแƒแƒ แƒ›แƒแƒขแƒจแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒกแƒ˜แƒ›แƒ”แƒ‘แƒ˜แƒแƒœแƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒ—.

FromJSON(data []byte) แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก JSON-แƒ“แƒแƒœ แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒจแƒ˜.

Check() bool แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒฅแƒ›แƒœแƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒฐแƒ”แƒจแƒก แƒ“แƒ แƒแƒ“แƒแƒ แƒ”แƒ‘แƒก แƒ›แƒแƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒฐแƒ”แƒจแƒ˜แƒก แƒ•แƒ”แƒšแƒจแƒ˜ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒก.

GetTxsHash() แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ‘แƒšแƒแƒ™แƒจแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒ—แƒšแƒ˜แƒแƒœ แƒฐแƒ”แƒจแƒก.

GetMerkleRoot() แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก Merkle-แƒ˜แƒก แƒฎแƒ˜แƒก แƒคแƒ”แƒกแƒ•แƒก แƒ‘แƒšแƒแƒ™แƒจแƒ˜ แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

Sign (privk string) แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒฎแƒ”แƒšแƒก แƒแƒฌแƒ”แƒ แƒก แƒ‘แƒšแƒแƒ™แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒจแƒ”แƒ›แƒฅแƒ›แƒœแƒ”แƒšแƒ˜แƒก แƒžแƒ˜แƒ แƒแƒ“แƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒ—.

SetHeight(height int) แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒฌแƒ”แƒ แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒกแƒ˜แƒ›แƒแƒฆแƒšแƒ”แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒ•แƒ”แƒšแƒจแƒ˜.

GetHeight() int แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒกแƒ˜แƒ›แƒแƒฆแƒšแƒ”แƒก, แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒก แƒ•แƒ”แƒšแƒจแƒ˜.

ToGOBBytes() []byte แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒจแƒ˜แƒคแƒ แƒแƒ•แƒก แƒ‘แƒšแƒแƒ™แƒก GOB แƒคแƒแƒ แƒ›แƒแƒขแƒจแƒ˜ แƒ“แƒ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ›แƒแƒก แƒ‘แƒแƒ˜แƒขแƒ˜แƒก แƒœแƒแƒญแƒ”แƒ แƒแƒ“.

FromGOBBytes(data []byte) แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒฌแƒ”แƒ แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒแƒจแƒ˜ แƒ’แƒแƒ“แƒแƒกแƒฃแƒšแƒ˜ แƒ‘แƒแƒ˜แƒขแƒ˜แƒก แƒœแƒแƒญแƒ”แƒ แƒ˜แƒ“แƒแƒœ GOB แƒคแƒแƒ แƒ›แƒแƒขแƒจแƒ˜.

GetHash() แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒฐแƒ”แƒจแƒก.

GetPrevHash() แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒฌแƒ˜แƒœแƒ แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒฐแƒ”แƒจแƒก.

แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ SetPublicKey(pubk string) แƒฌแƒ”แƒ แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒจแƒ”แƒ›แƒฅแƒ›แƒœแƒ”แƒšแƒ˜แƒก แƒกแƒแƒฏแƒแƒ แƒ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒก แƒ‘แƒšแƒแƒ™แƒจแƒ˜.

แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, Block แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒขแƒแƒœแƒแƒ— แƒ˜แƒ’แƒ˜ แƒฅแƒกแƒ”แƒšแƒจแƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒจแƒ˜ แƒ“แƒ LevelDB แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒจแƒ”แƒกแƒแƒœแƒแƒฎแƒแƒ“.

แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒจแƒ˜ แƒจแƒ”แƒœแƒแƒฎแƒ•แƒแƒ–แƒ”: 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() แƒแƒ แƒ˜แƒก wrapper db.Cloce()-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒ’แƒแƒ›แƒแƒ˜แƒซแƒแƒฎแƒ”แƒ‘แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—.

SetTargetBlockHash(hash string) แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒฌแƒ”แƒ แƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒฐแƒ”แƒจแƒก BLOCK_HASH แƒ™แƒแƒœแƒกแƒขแƒแƒœแƒขแƒ˜แƒ— แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜.

GetTargetBlockHash() (แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜, แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ) แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒจแƒ”แƒœแƒแƒฎแƒฃแƒšแƒ˜ แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒฐแƒ”แƒจแƒก.

SetTargetBlockHeight(height int) แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒฌแƒ”แƒ แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒ˜แƒก แƒกแƒ˜แƒ›แƒแƒฆแƒšแƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก BLOCK_HEIGHT แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒ˜แƒ— แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒ—.

GetTargetBlockHeight() (int, error) แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒ˜แƒก แƒกแƒ˜แƒ›แƒแƒฆแƒšแƒ”แƒก แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒœแƒแƒฎแƒ”แƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜.

CheckBlock(block IBlock) bool แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒกแƒ˜แƒกแƒฌแƒแƒ แƒ”แƒก แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒจแƒ˜ แƒแƒ› แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒแƒ›แƒ“แƒ”.

AddBlock(block IBlock) แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒแƒ›แƒแƒขแƒ”แƒ‘แƒก แƒ‘แƒšแƒแƒ™แƒก แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒจแƒ˜.

แƒ‘แƒšแƒแƒ™แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒžแƒแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒœแƒแƒฎแƒ•แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก explore.go แƒคแƒแƒ˜แƒšแƒจแƒ˜:

GetBlockByHash(hash string) (*block.Block, error) แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒฅแƒ›แƒœแƒ˜แƒก แƒชแƒแƒ แƒ˜แƒ”แƒš แƒ‘แƒšแƒแƒ™ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒก, แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒก แƒ›แƒแƒกแƒจแƒ˜ แƒ‘แƒšแƒแƒ™แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒ“แƒแƒœ, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒฐแƒ”แƒจแƒ˜แƒช แƒ›แƒแƒก แƒ’แƒแƒ“แƒแƒ”แƒชแƒ แƒ“แƒ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ›แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ”แƒšแƒก.

แƒ’แƒ”แƒœแƒ”แƒ–แƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ“แƒ”แƒ‘แƒ Genesis() แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒ— แƒ‘แƒšแƒแƒ™แƒฉแƒ”แƒ˜แƒœแƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก genesis.go แƒคแƒแƒ˜แƒšแƒ˜แƒ“แƒแƒœ.

แƒ›แƒแƒ›แƒ“แƒ”แƒ•แƒœแƒ แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘แƒ— แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒแƒ–แƒ” WebSocket แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ