ααΎααααΈαααα ααααΆαα½αααΉα blockchain αα·ααα·αααααΉαααααΌαααααΆααα·ααααααααα»ααααααα ααΎαααααΌαααααααααΆαα»ααααΆαααα ααα½α 3 αα αααα»αααααααααααααΎαα
- ααΆααα·αααααΆα’αααΈαα ααΆαααααααααα·αααααααααα»α αα·ααα·ααΈααΆααααα
- ααΆααα·αααααΆα’αααΈαα ααΆαααααααααα·αααααα αα·ααα·ααΈααΆαααααααααα·ααααα·ααΆα
- αα»αααΆα Blockchain ααααααααΆαα»ααααα»ααα αααα»αααΌαααααΆααα·αααααα αα·αααααααααα½αααΆαα ααΈαααααααααααΆ α¬αααααα (α¬α’αααΈαααααααα)α
αααααΊααΆα’αααααααΈααΈαα’αααΈ blockchain αααααΆααα§ααααΆα αααα ααΈαα½α
αααα αα αΆαααΌααααα½ααααα’αααα’αΆαααΆααα½ααααα»αα’αααΈα’ααααααα»ααα αααα»ααααααΈααα ααΆαα½αααααααΌαααΆαααααααααΆαα: αααα»αααααΈααα ααΌαααααΆααα·αααααα LevelDB ααααΌαααΆαααααΎααΎααααΈαααααΆαα»ααα·αααααα blockchain ααα»ααααααααΆαα’αααΈααΆααΆααα’αααααΈααΆαααααΎααααΆαααααααααααα αα·ααΆαααΆ 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 αααααΆαα»α hash ααααααα·ααααα·ααΆαααααα·αααααααααΌαααΆαααα α ααα½ααααααααα αα·α bytecode ααα α αΎααααααα TxOut αααααΆαα»αααααααα½αα ααα½α αα·α bytecode αααααα
α₯α‘αΌαβααΎαβααΎαβααΆβαααααααΆαβα’αααΈβαααβααααα·ααααα·ααΆαβα’αΆα βααααΎβααΆαβααΎβαα·ααααααβααααβααΆ α§. αααααΎααα·ααΈααΆαααααα
ααΎααααΈαααααΎαααααα·ααααα·ααΆα ααΌαααααΎαα»αααΆα transaction.NewTransaction(txtype byte) *TXα
αα·ααΈααΆααααα AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) ααααααααΆααααα αΌααα αααα»αααααα·ααααα·ααΆαα
αα·ααΈααΆααααα AddTxOut(value int, data []byte) (*TxOut, error) αααααααααααααα ααααα·ααααα·ααΆαα
αα·ααΈααΆααααα ToBytes() []byte ααααααααΆαααααα·ααααα·ααΆααα ααΆ byte sliceα
αα»αααΆαααΆααααα»α preByteHash(bytes []byte) string ααααΌαααΆαααααΎαααα»α Build() αα·α Check() ααΎααααΈααααΎα±ααααααα·ααααα·ααΆααααααΆααααααΎαααααΌαααααΆααΆαα½αααΉααααααΆααααα·ααααα·ααΆααααααΆααααααΎαααΈαααααα·ααΈ JavaScript α
αα·ααΈααΆααααα Build() ααααα hash ααααα·ααααα·ααΆαααΌα ααΆααααααα tx.TxHash = preByteHash(tx.ToBytes()) α
αα·ααΈααΆαααααααααα’αααα ToJSON() αααααααααααα·ααααα·ααΆααα ααΆααααα’αααα JSON α
αα·ααΈααΆαααααααα α»α FromJSON(αα·αααααα []byte) αααα»αααααα·ααααα·ααΆαααΈαααααα JSON αααααΆαααααααΆααααΆααααα»αααα
αα·ααΈααΆααααα Check() bool αααααααα hash ααααααααΈααααα·ααααα·ααΆα hash field ααΆαα½αααΉα hash αααααα½αααΆα ααΆααααααααααΆα hashing ααααα·ααααα·ααΆαααα (αα·αα’αΎααΎααΉα hash field)α
ααααα·ααααα·ααΆαααααΌαααΆααααααααα
αααα»αα
αα ααΆαααααααααα·αααααααααα»αααΆααααααΊααΆααααα αααΎαα
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 ααααα hash αααααα»ααα»α αα·αααααααααααααααααΆαααααα»ααααααΆααααααΎααα
αααα»α blockchainα αααααααααα»αααααΌαααΆαααααααααααααΈαααααααααααα
αααααα
b.DataType = types.BLOCK_TYPE.
αα·ααΈααΆααααα AddTx(tx *transaction.TX) ααααααααααα·ααααα·ααΆααα αααα»αα
αα·ααΈααΆααααα Build() αααα»αααααααα αααα»αααΆααααααααα»α α αΎααααααΎα αα·αααααααααααΆαα αα α»ααααααααααααΆα
αα·ααΈααΆααααα ToBytesHeader() []byte αααααααααααααΆαααα»α (αααααααΆαααααα·ααααα·ααΆα) αα ααΆαααααααα
αα·ααΈααΆαααααααααα’αααα ToJSON() ααααααααααα»ααα ααΆαααααα JSON αααα»αααααΆαααααα’αααααααα·ααααααα
αα·ααΈααΆαααααααα α»α FromJSON(αα·αααααα []αα) αααα»ααα·ααααααααΈ JSON αα αααα»ααα ααΆαααααααααααα»αα
αα·ααΈααΆααααα Check() bool αααααΎα block hash α αΎαααααααααααΆααΆαα½αααΉαα’αααΈαααααΆααααααΆαααα αααα»α block hash fieldα
αα·ααΈααΆαααααααααα’αααα GetTxsHash() αααα‘αα hash ααα»αααααααα·ααααα·ααΆαααΆααα’αααα αααα»ααααα»αα
αα·ααΈααΆααααα GetMerkleRoot() αααααΆααα«αααααααααααΆα Merkle αααααΆααααααα·ααααα·ααΆααααα»ααααα»αα
αα·ααΈααΆααααα Sign(privk string) α α»αα αααααααΆααΎαααα»ααααααααΎααα―αααααααα’ααααααααΎααααα»αα
αα·ααΈααΆααααα SetHeight(height int) ααααααααααααααα»ααα ααΆααα ααΆαααααααααααα»αα
αα·ααΈααΆααααα GetHeight() int αααα‘αααααααααααα»αααΌα αααααΆααααααΆαααα αααα»αααΆααααααααΌαααααΆαααα ααΆαααααααααααα»αα
αα·ααΈααΆααααα ToGOBBytes() []byte α’αα·αααΌααααα»ααααα»ααααααα GOB α αΎααααα‘ααααΆααΆααααα»αααα
αα·ααΈααΆαααααααα α»α FromGOBBytes(αα·αααααα []αα) ααααααα·αααααααααα»ααα αα ααΆαααααααααααα»αααΈα ααα·ααααααααααΆαααααααΆαααααα»ααααααα GOB α
αα·ααΈααΆαααααααααα’αααα GetHash() αααα‘αα hash αααααα»ααααααΆααααααα±ααα
αα·ααΈααΆαααααααααα’αααα GetPrevHash() αααα‘αα hash αααααα»ααα»αα
αα·ααΈααΆααααα SetPublicKey(pubk string) αααααααααΆααΆαααααααα’ααααααααΎααααα»ααα ααΆαααααα»αα
ααΌα αααααααααααΎαα·ααΈααΆαααααααααααα» Block ααΎαα’αΆα αααααααααΆαααΆαααΆααααα½ααα ααΆαααααααααααΆααααΆααααααΌαααΆααααααΆα αα·ααααααΆαα»ααα αααα»αααΌαααααΆααα·αααααα LevelDB α
αα»αααΆααααααα
αα blockchain ααα½ααα»αααααΌαα
ααααααΆααααααΆαα»ααα
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(hash string) ααααα hash αααααα»ααα αα α»ααααααααΆαα½αααΉα key αααααΆααααααΆααααα BLOCK_HASH ααααα ααΆαα databaseα
αα»αααΆα GetTargetBlockHash() (string, error) αααα‘αα hash αααααα»ααα αα α»ααααααααααααααΆαα»ααααα»α databaseα
αα»αααΆαααα α»α SetTargetBlockHeight(height int) ααααααα ααΌαααααΆααα·ααααααααΌαααααααααααααα blockchain αααααΆααααααΆαααααααΆαααΌααααααααΆααααααΆααααα BLOCK_HEIGHT αααα
α’αα»αααα GetTargetBlockHeight() (int, error) αααα‘αααααααααα blockchain αααααΆααααααΆαααααααΆααααααα±αα αααααΆαα»ααααα»αααΌαααααΆααα·ααααααα
αα»αααΆα CheckBlock (block IBlock) bool αα·αα·αααααΎααααα»ααααααΆααααΆαααααΉαααααΌααα»αααααααααααααα»αααααα blockchain α
αα»αααΆαααα α»α AddBlock (block IBlock) αααααααααα»ααα blockchain α
αα»αααΆααααααΆααααΆαααΆααα αα·αααΎααααα»αααΆααα αααα»αα―αααΆα explore.go αααααα αα blockchainα
α’αα»αααα GetBlockByHash(hash string) (*block.Block, error) αααααΎαααααα»αααα»αααα αααα»ααααα»αα αΌααα αααα»αααΆααΈααΌαααααΆααα·αααααα αααααΆαααααΆαααααααααΌαααΆααααααΌααα ααΆ α αΎααααα‘ααααααα·α αα ααΆα
ααΆααααααΎααααα»α genesis ααααΌαααΆαα’αα»ααααααααα»αααΆαααα α»α Genesis() ααΈα―αααΆα genesis.go αααααα αα blockchain α
α’ααααααααααΆααααΉααα·ααΆαα’αααΈααΆαααααΆααα’αα·αα·αααα
ααααΆαααααααααΎααααααΆα WebSocket α
ααααα: www.habr.com