ื•ื•ื™ ืื™ืš ื“ื™ื–ื™ื™ื ื“ ื‘ืœืึทืงืก ืื•ืŸ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืื™ืŸ ืžื™ื™ืŸ Go blockchain

ืื™ืŸ ืกื“ืจ ืฆื• ืกื•ืฃ ืึทืจื•ื™ืฃ ืžื™ื˜ ืึท ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ืื•ืŸ ื ื™ื˜ ื ืึธืจ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืœื™ื™ื’ืŸ 3 ื•ื•ื™ื›ื˜ื™ืง ืขืœืขืžืขื ื˜ืŸ ืฆื• ืื•ื ื“ื–ืขืจ ืคึผืจื•ื™ืขืงื˜:

  • ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ื“ื™ ื‘ืœืึธืง ื“ืึทื˜ืŸ ืกื˜ืจื•ืงื˜ื•ืจ ืื•ืŸ ืžืขื˜ื”ืึธื“ืก
  • ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ื“ืึทื˜ืŸ ืกื˜ืจื•ืงื˜ื•ืจ ืื•ืŸ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืžืขื˜ื”ืึธื“ืก
  • ื‘ืœืึธืงื˜ืฉื™ื™ืŸ ืคืึทื ื’ืงืฉืึทื ื– ื•ื•ืึธืก ืจืึทื˜ืขื•ื•ืขืŸ ื‘ืœืึทืงืก ืื™ืŸ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก ืื•ืŸ ื’ืขืคึฟื™ื ืขืŸ ื–ื™ื™ ื“ืึธืจื˜ ื“ื•ืจืš ื–ื™ื™ืขืจ ื”ืึทืฉ ืึธื“ืขืจ ื”ื™ื™ืš (ืึธื“ืขืจ ืขืคึผืขืก ืึทื ื“ืขืจืฉ).

ื•ื•ื™ ืื™ืš ื“ื™ื–ื™ื™ื ื“ ื‘ืœืึทืงืก ืื•ืŸ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืื™ืŸ ืžื™ื™ืŸ Go blockchain

ื“ืึธืก ืื™ื– ื“ืขืจ ืฆื•ื•ื™ื™ื˜ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ืคึฟืึทืจ ืื™ื ื“ื•ืกื˜ืจื™ืข, ื“ืขืจ ืขืจืฉื˜ืขืจ ื“ืึธ.

ื’ืขื“ืขื ืงื˜ ื“ื™ ืคึฟืจืื’ืŸ ื•ื•ืึธืก ืœื™ื™ืขื ืขืจ ืžื™ืจ ื’ืขืคืจืขื’ื˜ ื•ื•ืขื’ืŸ ื“ืขื ืคืจื™ืขืจื“ื™ืงืŸ ืึทืจื˜ื™ืงืœ ืื™ืŸ ื“ืขื ืกืขืจื™ืข, ืขืก ื–ืึธืœ ื–ื™ื™ืŸ ืื ื’ืขื•ื•ื™ื–ืŸ: ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ื™ ืœืขื•ื•ืขืœื“ื‘ ื“ืึทื˜ืึทื‘ื™ื™ืก ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ืงืจืึธื ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ื“ืึทื˜ืŸ, ืึธื‘ืขืจ ื’ืึธืจื ื™ืฉื˜ ืคึผืจื™ื•ื•ืขื ืฅ ืื™ืจ ืคื•ืŸ ื ื™ืฆืŸ ืงื™ื™ืŸ ืื ื“ืขืจืข, ืœืžืฉืœ, 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), ื“ื™ ื”ืึทืฉ ืคื•ืŸ ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ, ื“ื™ ื˜ื™ืคึผ ืคื•ืŸ ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื–ื™ืš, ืึท ื˜ื™ืžืขืกื˜ืึทืžืคึผ ืื•ืŸ ื™ื ืคึผื•ืฅ ืื•ืŸ ืึทื•ื˜ืคึผื•ืฅ. ื˜ืงืกื™ืŸ ื™ื ืคึผื•ืฅ ืงืจืึธื ื“ื™ ื”ืึทืฉ ืคื•ืŸ ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื•ื•ืขืžืขื ืก ืจืขื–ื•ืœื˜ืึทื˜ ืื™ื– ืจืขืคืขืจืจืขื“, ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื“ืขื ืจืขื–ื•ืœื˜ืึทื˜ ืื•ืŸ ื‘ื™ื˜ืขืงืึธื“ืข, ืื•ืŸ TxOut ืึทื•ื˜ืคึผื•ืฅ ืงืจืึธื ืขื˜ืœืขื›ืข ื•ื•ืขืจื˜ ืื•ืŸ ืื•ื™ืš ื‘ื™ื˜ืขืงืึธื“ืข.

ืื™ืฆื˜ ืœืึธื–ืŸ ืก ื–ืขืŸ ื•ื•ืึธืก ืึทืงืฉืึทื ื– ืึท ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืงืขื ืขืŸ ื“ื•ืจื›ืคื™ืจืŸ ืื•ื™ืฃ ื–ื™ื™ึทืŸ ื“ืึทื˜ืŸ, ื™.ืข. ื–ืืœ ืก ืงื•ืง ืื™ืŸ ื“ื™ ืžืขื˜ื”ืึธื“ืก.

ืฆื• ืฉืึทืคึฟืŸ ืึท ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ, ื ื•ืฆืŸ ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ. ื ืขื•ื•ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ (ื˜ืงืกื˜ื™ืคึผืข ื‘ื™ื™ื˜) * ื˜ืงืก ืคึฟื•ื ืงืฆื™ืข.

ื“ื™ AddTxIn (thattxhash [] ื‘ื™ื™ื˜, txoutn int, ืงืึธื“ [] ื‘ื™ื™ื˜) (* TxIn, ื˜ืขื•ืช) ืื•ืคึฟืŸ ืžื•ืกื™ืฃ ืึทืŸ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืฆื• ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ.

ื“ื™ AddTxOut (ื•ื•ืขืจื˜ ื™ื ื˜, ื“ืึทื˜ืŸ [] ื‘ื™ื™ื˜) (* TxOut, ื˜ืขื•ืช) ืื•ืคึฟืŸ ืžื•ืกื™ืฃ ืึท ืจืขื–ื•ืœื˜ืึทื˜ ืฆื• ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ.

ื“ื™ ToBytes () [] ื‘ื™ื™ื˜ ืื•ืคึฟืŸ ื˜ื•ืจื ืก ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืื™ืŸ ืึท ื‘ื™ื™ื˜ ืจืขืคื˜ืœ.

ื“ื™ ื™ื ืขืจืœืขืš ืคึฟื•ื ืงืฆื™ืข preByteHash (ื‘ื™ื˜ืขืก [] ื‘ื™ื™ื˜) ืฉื˜ืจื™ืงืœ ืื™ื– ื’ืขื ื™ืฆื˜ ืื™ืŸ Build () ืื•ืŸ ืงื•ืง () ืฆื• ืžืึทื›ืŸ ื“ื™ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื”ืึทืฉ ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ ืžื™ื˜ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื”ืึทืฉืขืก ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืคึฟื•ืŸ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–.

ื“ื™ Build() ืื•ืคึฟืŸ ืฉื˜ืขืœื˜ ื“ื™ ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ื”ืึทืฉ ื•ื•ื™ ื’ื™ื™ื˜: tx.TxHash = preByteHash(tx.ToBytes()).

ื“ื™ ToJSON () ืฉื˜ืจื™ืงืœ ืื•ืคึฟืŸ ืงืึทื ื•ื•ืขืจืฅ ืึท ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืื™ืŸ ืึท JSON ืฉื˜ืจื™ืงืœ.

ื“ืขืจ FromJSON (ื“ืึทื˜ืึท [] ื‘ื™ื™ื˜) ื˜ืขื•ืช ืื•ืคึฟืŸ ืœืึธื•ื“ื– ืึท ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืคึฟื•ืŸ ื“ื™ 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 ืื™ื– ื“ืขืจ ื•ื•ืึธืจืฆืœ ืคื•ืŸ ื“ื™ ืžืขืจืงืœืข ื‘ื•ื™ื.

ื•ื•ื™ื™ึทื˜ืขืจ ืื™ืŸ ื“ื™ ืคืขืœื“ืขืจ ืขืก ืื™ื– ื“ืขืจ ืฆื™ื‘ื•ืจ ืฉืœื™ืกืœ ืคื•ืŸ ื“ืขืจ ื‘ืืฉืขืคืขืจ ืคื•ืŸ ื“ื™ ื‘ืœืึธืง, ื“ื™ ื›ืกื™ืžืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื‘ืืฉืขืคืขืจ, ื“ื™ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื‘ืœืึธืง, ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืื™ืŸ ื“ื™ ื‘ืœืึธืง, ืื•ืŸ ื“ื™ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ื–ื™ืš.

ื–ืืœ ืก ืงื•ืง ืื™ืŸ ื–ื™ื™ึทืŸ ืžืขื˜ื”ืึธื“ืก:
ืฆื• ืฉืึทืคึฟืŸ ืึท ื‘ืœืึธืง, ื ื•ืฆืŸ ื“ื™ block.NewBlock() ืคึฟื•ื ืงืฆื™ืข: NewBlock(prevBlockHash string, height int) *Block, ื•ื•ืึธืก ื ืขืžื˜ ื“ื™ ื”ืึทืฉ ืคื•ืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ื‘ืœืึธืง ืื•ืŸ ื“ื™ ื”ื™ื™ืš ืฉื˜ืขืœืŸ ืคึฟืึทืจ ื“ื™ ื‘ืืฉืืคืŸ ื‘ืœืึธืง ืื™ืŸ ื“ื™ ื‘ืœืึธืงื˜ืฉื™ื™ืŸ. ื“ื™ ื‘ืœืึธืง ื˜ื™ืคึผ ืื™ื– ืื•ื™ืš ื‘ืึทืฉื˜ื™ืžื˜ ืคึฟื•ืŸ ื“ื™ ื˜ื™ืคึผ ืคึผืขืงืœ ืงืขืกื™ื™ื“ืขืจื“ื™ืง:

b.DataType = types.BLOCK_TYPE.

ื“ื™ AddTx(tx *transaction.TX) ืื•ืคึฟืŸ ืžื•ืกื™ืฃ ืึท ื˜ืจืึทื ืกืึทืงื˜ื™ืึธืŸ ืฆื• ืึท ื‘ืœืึธืง.

ื“ื™ Build () ืื•ืคึฟืŸ ืœืึธื•ื“ื– ื•ื•ืึทืœื•ืขืก ืื™ืŸ ื“ื™ ืคืขืœื“ืขืจ ืคื•ืŸ ื“ื™ ื‘ืœืึธืง ืื•ืŸ ื“ื–ืฉืขื ืขืจื™ื™ืฅ ืื•ืŸ ืฉื˜ืขืœื˜ ื–ื™ื™ืŸ ืงืจืึทื ื˜ ื”ืึทืฉ.

ื“ื™ ToBytesHeader () [] ื‘ื™ื™ื˜ ืื•ืคึฟืŸ ืงืึทื ื•ื•ืขืจืฅ ื“ื™ ื‘ืœืึธืง ื›ืขื“ืขืจ (ืึธืŸ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื–) ืื™ืŸ ืึท ื‘ื™ื™ื˜ ืจืขืคื˜ืœ.

ื“ื™ ToJSON () ืฉื˜ืจื™ืงืœ ืื•ืคึฟืŸ ืงืึทื ื•ื•ืขืจืฅ ื“ื™ ื‘ืœืึธืง ืฆื• JSON ืคึฟืึธืจืžืึทื˜ ืื™ืŸ ืึท ืฉื˜ืจื™ืงืœ ืคืึทืจื˜ืจืขื˜ื•ื ื’ ืคื•ืŸ ื“ื™ ื“ืึทื˜ืŸ.

ื“ื™ FromJSON (ื“ืึทื˜ืึท [] ื‘ื™ื™ื˜) ื˜ืขื•ืช ืื•ืคึฟืŸ ืœืึธื•ื“ื– ื“ืึทื˜ืŸ ืคื•ืŸ JSON ืื™ืŸ ืึท ื‘ืœืึธืง ืกื˜ืจื•ืงื˜ื•ืจ.

ื“ื™ ื˜ืฉืขืง () ื‘ื•ืœ ืžืขื˜ืึธื“ ื“ื–ืฉืขื ืขืจื™ื™ืฅ ืึท ื‘ืœืึธืง ื”ืึทืฉ ืื•ืŸ ืงืึทืžืคึผืขืจื– ืขืก ืžื™ื˜ ื“ื™ ืกืคึผืขืกื™ืคื™ืขื“ ืื™ืŸ ื“ื™ ื‘ืœืึธืง ื”ืึทืฉ ืคืขืœื“.

ื“ื™ GetTxsHash () ืฉื˜ืจื™ืงืœ ืื•ืคึฟืŸ ืงืขืจื˜ ื“ื™ ื’ืึทื ืฅ ื”ืึทืฉ ืคื•ืŸ ืึทืœืข ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืื™ืŸ ื“ืขื ื‘ืœืึธืง.

ื“ื™ GetMerkleRoot () ืื•ืคึฟืŸ ืกืคึผืขืฆื™ืคื™ืฆื™ืจื˜ ื“ื™ ื•ื•ืึธืจืฆืœ ืคื•ืŸ ื“ื™ Merkle ื‘ื•ื™ื ืคึฟืึทืจ ื˜ืจืึทื ื–ืึทืงืฉืึทื ื– ืื™ืŸ ืึท ื‘ืœืึธืง.

ื“ื™ Sign (privk string) ืžืขื˜ืึทื“ ืกื™ื’ื ืึทืœื– ืึท ื‘ืœืึธืง ืžื™ื˜ ื“ื™ ืคึผืจื™ื•ื•ืึทื˜ ืฉืœื™ืกืœ ืคื•ืŸ ื“ื™ ื‘ืœืึธืง ื‘ืืฉืขืคืขืจ.

ื“ื™ SetHeight (ื”ื™ื™ืš ื™ื ื˜) ืื•ืคึฟืŸ ืฉืจื™ื™ื‘ื˜ ื“ื™ ื”ื™ื™ืš ืคื•ืŸ ื“ื™ ื‘ืœืึธืง ืฆื• ื“ื™ ื‘ืœืึธืง ืกื˜ืจื•ืงื˜ื•ืจ ืคืขืœื“.

ื“ืขืจ 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 (ื”ืึทืฉ ืฉื˜ืจื™ืงืœ) ื˜ืขื•ืช ืคึฟื•ื ืงืฆื™ืข ืฉืจื™ื™ื‘ื˜ ื“ื™ ื”ืึทืฉ ืคื•ืŸ ื“ืขื ืงืจืึทื ื˜ ื‘ืœืึธืง ืžื™ื˜ ื“ื™ ืฉืœื™ืกืœ ืกืคึผืขืกื™ืคื™ืขื“ ื“ื•ืจืš ื“ื™ BLOCK_HASH ืงืขืกื™ื™ื“ืขืจื“ื™ืง ืฆื• ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก.

ื“ื™ GetTargetBlockHash () (ืฉื˜ืจื™ืงืœ, ื˜ืขื•ืช) ืคึฟื•ื ืงืฆื™ืข ืงืขืจื˜ ื“ื™ ื”ืึทืฉ ืคื•ืŸ ื“ืขื ืงืจืึทื ื˜ ื‘ืœืึธืง ืกื˜ืึธืจื“ ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก.

ื“ื™ SetTargetBlockHeight (ื”ื™ื™ืš ื™ื ื˜) ื˜ืขื•ืช ืคึฟื•ื ืงืฆื™ืข ืฉืจื™ื™ื‘ื˜ ืฆื• ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก ื“ื™ ื•ื•ืขืจื˜ ืคื•ืŸ ื“ื™ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ื”ื™ื™ืš ืคึฟืึทืจ ื“ื™ ื ืึธื“ืข ืžื™ื˜ ื“ื™ ืฉืœื™ืกืœ ืกืคึผืขืกื™ืคื™ืขื“ ื“ื•ืจืš ื“ื™ BLOCK_HEIGHT ืงืขืกื™ื™ื“ืขืจื“ื™ืง.

ื“ื™ GetTargetBlockHeight () (ื™ื ื˜, ื˜ืขื•ืช) ืคึฟื•ื ืงืฆื™ืข ืงืขืจื˜ ื“ื™ ื”ื™ื™ืš ืคื•ืŸ ื“ื™ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ืคึฟืึทืจ ืึท ื’ืขื’ืขื‘ืŸ ื ืึธื“ืข, ืกื˜ืึธืจื“ ืื™ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก.

ื“ื™ CheckBlock (ื‘ืœืึธืง IBlock) ื‘ื•ืœ ืคื•ื ืงืฆื™ืข ื˜ืฉืขืงืก ืึท ื‘ืœืึธืง ืคึฟืึทืจ ืงืขืจืขืงื˜ื ืึทืก ืื™ื™ื“ืขืจ ืึทื“ื™ื ื’ ื“ืขื ื‘ืœืึธืง ืฆื• ื“ื™ ื‘ืœืึธืงื˜ืฉื™ื™ืŸ.

ื“ื™ AddBlock (ื‘ืœืึธืง IBlock) ื˜ืขื•ืช ืคึฟื•ื ืงืฆื™ืข ืžื•ืกื™ืฃ ืึท ื‘ืœืึธืง ืฆื• ื“ื™ ื‘ืœืึธืงื˜ืฉื™ื™ืŸ.

ื“ื™ ืคืึทื ื’ืงืฉืึทื ื– ืคึฟืึทืจ ืจื™ื˜ืจื™ื•ื•ื™ื ื’ ืื•ืŸ ื•ื•ื™ื•ื™ื ื’ ื‘ืœืึทืงืก ื–ืขื ืขืŸ ืื™ืŸ ื“ื™ explore.go ื˜ืขืงืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ืคึผืขืงืœ:

ื“ื™ GetBlockByHash (ื”ืึทืฉ ืฉื˜ืจื™ืงืœ) (*block.Block, ื˜ืขื•ืช) ืคึฟื•ื ืงืฆื™ืข ืงืจื™ื™ื™ืฅ ืึท ืœื™ื™ื“ื™ืง ื‘ืœืึธืง ื›ื™ื™ืคืขืฅ, ืœืึธื•ื“ื– ืึท ื‘ืœืึธืง ืื™ืŸ ืขืก ืคึฟื•ืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก, ื“ื™ ื”ืึทืฉ ืคื•ืŸ ื•ื•ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ืฆื• ืื™ื, ืื•ืŸ ืงืขืจื˜ ืึท ื˜ื™ื™ึทื˜ืœ ืฆื• ืขืก.

ื“ื™ ืฉืึทืคื•ื ื’ ืคื•ืŸ ืึท ื’ืขื ืขืกื™ืก ื‘ืœืึธืง ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ื“ื•ืจืš ื“ื™ ื’ืขื ืขืกื™ืก () ื˜ืขื•ืช ืคึฟื•ื ืงืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื’ืขื ืขืกื™ืก.ื’ืึธ ื˜ืขืงืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื‘ืœืึทืงื›ื™ื™ื•ื•ืึทืŸ ืคึผืขืงืœ.

ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ืจืขื“ืŸ ื•ื•ืขื’ืŸ ืงืึทื ืขืงื˜ื™ื ื’ ืงืœื™ื™ืึทื ืฅ ืฆื• ืึท ื ืึธื“ืข ื ื™ืฆืŸ ื“ื™ WebSocket ืžืขืงืึทื ื™ื–ืึทื.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’