ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΡΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½, Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ , Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ 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 Ρ ΡΠ°Π½ΡΡ, ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠΎΠΆΠ΅ Π±Π°ΠΉΡΠΊΠΎΠ΄.
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π°Π΄ ΡΠ²ΠΎΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Ρ.Π΅. ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Ρ.
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΡΠ»ΡΠΆΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ transaction.NewTransaction(txtype byte) *TX.
ΠΠ΅ΡΠΎΠ΄ AddTxIn(thattxhash []byte, txoutn int, code []byte) (*TxIn, error) Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π²Ρ ΠΎΠ΄ ΠΊ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
ΠΠ΅ΡΠΎΠ΄ AddTxOut(value int, data []byte) (*TxOut, error) Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π²ΡΡ ΠΎΠ΄ ΠΊ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
ΠΠ΅ΡΠΎΠ΄ ToBytes() []byte ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² Π±Π°ΠΉΡΠΎΠ²ΡΠΉ ΡΡΠ΅Π·.
ΠΠ½ΡΡΡΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ preByteHash(bytes []byte) string ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² Build() ΠΈ Check() Π΄Π»Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ Π΅ΡΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Ρ Ρ Π΅ΡΠ°ΠΌΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΡΠΌΠΈ ΠΈΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° JavaScript.
ΠΠ΅ΡΠΎΠ΄ Build() Π·Π°Π΄Π°Π΅Ρ Ρ Π΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ: tx.TxHash = preByteHash(tx.ToBytes()).
ΠΠ΅ΡΠΎΠ΄ ToJSON() string ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² JSON ΡΡΡΠΎΠΊΡ.
ΠΠ΅ΡΠΎΠ΄ FromJSON(data []byte) error Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΠΈΠ· ΡΠΎΡΠΌΠ°ΡΠ° 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 Ρ
ΡΠ°Π½ΠΈΡ Π²ΡΡΠΎΡΡ Π±Π»ΠΎΠΊΠ°.
Timestamp Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΌΠ΅ΡΠΊΡ.
HeaderSize ΡΠ°Π·ΠΌΠ΅Ρ Π±Π»ΠΎΠΊΠ° Π² Π±Π°ΠΉΡΠ°Ρ
.
PrevBlockHash Ρ
Π΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°, Π° SelfBlockHash β ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ.
TxsHash β ΡΡΠΎ ΠΎΠ±ΡΠΈΠΉ Ρ
Π΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ.
MerkleRoot β ΠΊΠΎΡΠ΅Π½Ρ Π΄Π΅ΡΠ΅Π²Π° ΠΠ΅ΡΠΊΠ»Π°.
ΠΠ°Π»Π΅Π΅ Π² ΠΏΠΎΠ»ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ Π±Π»ΠΎΠΊΠ°, ΠΏΠΎΠ΄ΠΏΠΈΡΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ, Π²Π΅ΡΡΠΈΡ Π±Π»ΠΎΠΊΠ°, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π² Π±Π»ΠΎΠΊΠ΅ ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°ΠΌΠΈ ΡΡΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΅Π³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ:
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠ° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ block.NewBlock(): NewBlock(prevBlockHash string, height int) *Block, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Ρ
Π΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΈ Π²ΡΡΠΎΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅. Π’Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Π΅ΡΡΡ ΡΠΈΠΏ Π±Π»ΠΎΠΊΠ° ΠΈΠ· ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ° types:
b.DataType = types.BLOCK_TYPE.
ΠΠ΅ΡΠΎΠ΄ AddTx(tx *transaction.TX) Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² Π±Π»ΠΎΠΊ.
ΠΠ΅ΡΠΎΠ΄ Build() Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΏΠΎΠ»Ρ Π±Π»ΠΎΠΊΠ° ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π΅Π³ΠΎ ΡΠ΅ΠΊΡΡΠΈΠΉ Ρ Π΅Ρ.
ΠΠ΅ΡΠΎΠ΄ ToBytesHeader() []byte ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π±Π»ΠΎΠΊΠ° (Π±Π΅Π· ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ) Π² Π±Π°ΠΉΡΠΎΠ²ΡΠΉ ΡΠ»Π°ΠΉΡ.
ΠΠ΅ΡΠΎΠ΄ ToJSON() string ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ Π±Π»ΠΎΠΊ Π² ΡΠΎΡΠΌΠ°Ρ JSON Π² ΡΡΡΠΎΠΊΠΎΠ²ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ .
ΠΠ΅ΡΠΎΠ΄ FromJSON(data []byte) error Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· JSON Π² ΡΡΡΡΠΊΡΡΡΡ Π±Π»ΠΎΠΊΠ°.
ΠΠ΅ΡΠΎΠ΄ Check() bool Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Ρ Π΅Ρ Π±Π»ΠΎΠΊΠ° ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ Π² ΠΏΠΎΠ»Π΅ Ρ Π΅ΡΠ° Π±Π»ΠΎΠΊΠ°.
ΠΠ΅ΡΠΎΠ΄ GetTxsHash() string Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠΈΠΉ Ρ Π΅Ρ Π²ΡΠ΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π² Π±Π»ΠΎΠΊΠ΅.
ΠΠ΅ΡΠΎΠ΄ GetMerkleRoot() Π·Π°Π΄Π°Π΅Ρ ΠΊΠΎΡΠ΅Π½Ρ Π΄Π΅ΡΠ΅Π²Π° ΠΠ΅ΡΠΊΠ»Π° Π΄Π»Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π² Π±Π»ΠΎΠΊΠ΅.
ΠΠ΅ΡΠΎΠ΄ Sign(privk string) ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΌ ΠΊΠ»ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ Π±Π»ΠΎΠΊΠ°.
ΠΠ΅ΡΠΎΠ΄ SetHeight(height int) Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π²ΡΡΠΎΡΡ Π±Π»ΠΎΠΊΠ° Π² ΠΏΠΎΠ»Π΅ ΡΡΡΡΠΊΡΡΡΡ Π±Π»ΠΎΠΊΠ°.
ΠΠ΅ΡΠΎΠ΄ GetHeight() int Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²ΡΡΠΎΡΡ Π±Π»ΠΎΠΊΠ° ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΠΏΠΎΠ»Π΅ ΡΡΡΡΠΊΡΡΡΡ Π±Π»ΠΎΠΊΠ°.
ΠΠ΅ΡΠΎΠ΄ ToGOBBytes() []byte ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ Π±Π»ΠΎΠΊ Π² GOB ΡΠΎΡΠΌΠ°Ρ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ Π±Π°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ»Π°ΠΉΡΠ°.
ΠΠ΅ΡΠΎΠ΄ FromGOBBytes(data []byte) error Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π±Π»ΠΎΠΊΠ° Π² ΡΡΡΡΠΊΡΡΡΡ Π±Π»ΠΎΠΊΠ° ΠΈΠ· ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ»Π°ΠΉΡΠ° Π² ΡΠΎΡΠΌΠ°ΡΠ΅ GOB.
ΠΠ΅ΡΠΎΠ΄ GetHash() string Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Ρ Π΅Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°.
ΠΠ΅ΡΠΎΠ΄ GetPrevHash() string Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Ρ Π΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°.
ΠΠ΅ΡΠΎΠ΄ SetPublicKey(pubk string) Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² Π±Π»ΠΎΠΊ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ Π±Π»ΠΎΠΊΠ°.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠ° Block ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² ΡΠΎΡΠΌΠ°Ρ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΏΠΎ ΡΠ΅ΡΠΈ ΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ LevelDB.
ΠΠ° ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ ΠΎΡΠ²Π΅ΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ° 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) error Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² ΠΠ Ρ Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠ° Ρ ΠΊΠ»ΡΡΠ΅ΠΌ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ BLOCK_HASH.
Π€ΡΠ½ΠΊΡΠΈΡ GetTargetBlockHash() (string, error) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Ρ Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°, Ρ ΡΠ°Π½ΡΡΠΈΠΉΡΡ Π² ΠΠ.
Π€ΡΠ½ΠΊΡΠΈΡ SetTargetBlockHeight(height int) error Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² ΠΠ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΡΠΎΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° Π΄Π»Ρ Π½ΠΎΠ΄Ρ Ρ ΠΊΠ»ΡΡΠ΅ΠΌ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ BLOCK_HEIGHT.
Π€ΡΠ½ΠΊΡΠΈΡ GetTargetBlockHeight() (int, error) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²ΡΡΠΎΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ Π½ΠΎΠ΄Ρ, Ρ ΡΠ°Π½ΠΈΠΌΡΡ Π² ΠΠ.
Π€ΡΠ½ΠΊΡΠΈΡ CheckBlock(block IBlock) bool Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π±Π»ΠΎΠΊΠ° Π½Π° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½.
Π€ΡΠ½ΠΊΡΠΈΡ AddBlock(block IBlock) error Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π±Π»ΠΎΠΊ Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½.
Π€ΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° Π±Π»ΠΎΠΊΠΎΠ² Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ explore.go ΠΏΠ°ΠΊΠ΅ΡΠ° blockchain:
Π€ΡΠ½ΠΊΡΠΈΡ GetBlockByHash(hash string) (*block.Block, error) ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΏΡΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠ°, Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΡΡΠ΄Π° Π±Π»ΠΎΠΊ ΠΈΠ· ΠΠ Ρ Π΅Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΅ΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π° Π½Π΅Π³ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° Π³Π΅Π½Π΅Π·ΠΈΡΠ° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Genesis() error ΠΈΠ· ΡΠ°ΠΉΠ»Π° genesis.go ΠΏΠ°ΠΊΠ΅ΡΠ° blockchain.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ ΡΠ΅ΡΡ ΠΏΠΎΠΉΠ΄Π΅Ρ ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ Π½ΠΎΠ΄Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° WebSocket.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com