แแแแกแแแแแก, แ แแ แกแแแแแแแ แแแแแฆแแ แแแแแฉแแแแ แแ แแ แ แแฎแแแแ แแแแแชแแแแ แแแแ, แฉแแแ แฃแแแ แแแแแแแขแแ 3 แแแแจแแแแแแแแแ แแแแแแแขแ แฉแแแแก แแ แแแฅแขแก:
- แแแแแแก แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแกแ แแ แแแแแแแแแก แแฆแฌแแ แ
- แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแกแ แแ แขแ แแแแแฅแชแแแก แแแแแแแแแก แแฆแฌแแ แ
- แแแแแฉแแแแแก แคแฃแแฅแชแแแแ, แ แแแแแแแช แแแแฎแแแก แแแแแแแก แแแแแชแแแแ แแแแแจแ แแ แแแฃแแแแก แแแ แฐแแจแแก แแ แกแแแแฆแแแก (แแ แกแฎแแ แ แแแแก) แแแฎแแแแแ.
แแก แแ แแก แแแแ แ แกแขแแขแแ แแแแแฉแแแแแก แจแแกแแฎแแ แแแแฃแกแขแ แแแกแแแแก, แแแ แแแแ
แแแแแฎแกแแแแ แแแแฎแแแแ, แ แแแแแแแช แแแแแฎแแแแแแแ แแแแแกแแแก แแ แกแแ แแแก แฌแแแ แกแขแแขแแแก แจแแกแแฎแแ, แฃแแแ แแฆแแแแจแแแก: แแ แจแแแแฎแแแแแจแ, LevelDB แแแแแชแแแแ แแแแ แแแแแแงแแแแแ แแแแแฉแแแแแก แแแแแชแแแแแแก แจแแกแแแแฎแแ, แแแแ แแ แแ แแคแแ แ แแแจแแแ แฎแแแก, แแแแแแงแแแแ แกแฎแแ, แแแฅแแแ, MySQL. แแฎแแ แแแแแ แจแแแฎแแแแ แแ แแแแแชแแแแแแก แกแขแ แฃแฅแขแฃแ แแก.
แแแแแฌแงแแ แขแ แแแแแฅแชแแแแแ:
แแฅ แแ แแก แแแกแ แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แ:
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 แแแแแแ แแแแ แแแก แขแ แแแแแฅแชแแแก แฐแแจแแก แแแแแแแ แแแฆแแแฃแ แฐแแจแก แแ แขแ แแแแแฅแชแแแก แฐแแจแแ แแแแก แจแแแแแแ แแแฆแแแฃแ แฐแแจแก (แฐแแจแแก แแแแแก แแแแแ แแ แแแ).
แขแ แแแแแฅแชแแแแ แแแแขแแแ แแแแแก:
แแแแแแก แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แ แฃแคแ แ แแแชแฃแแแแแแแ:
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 แแแแแชแแแแ แแแแแจแ แจแแกแแแแฎแแ.
แแแแแฉแแแแแก แแแแแขแแก แคแฃแแฅแชแแแแ แแแกแฃแฎแแกแแแแแแแแ แแแแแฉแแแแจแ แจแแแแฎแแแแ:
แแแแกแแแแแก แแแแแแ แฃแแแ แแแแแฎแแ แชแแแแแก 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