ΠΠ° Π΄Π° Π·Π°Π²ΡΡΡΠΈΠΌ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° Ρ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½, Π° Π½Π΅ ΡΠ°ΠΌΠΎ Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ 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) Π½ΠΈΠ· ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² Build() ΠΈ Check(), Π·Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈΡ Ρ Π΅Ρ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ Ρ Π΅ΡΠΎΠ²Π΅ Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° JavaScript.
ΠΠ΅ΡΠΎΠ΄ΡΡ Build() Π·Π°Π΄Π°Π²Π° Ρ Π΅ΡΠ° Π½Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΡΠ»Π΅Π΄Π²Π°: tx.TxHash = preByteHash(tx.ToBytes()).
ΠΠ΅ΡΠΎΠ΄ΡΡ Π½Π° Π½ΠΈΠ· ToJSON() ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² Π½ΠΈΠ· 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 Π΅ ΠΊΠΎΡΠ΅Π½ΡΡ Π½Π° Π΄ΡΡΠ²ΠΎΡΠΎ Merkle.
ΠΠΎ-Π½Π°ΡΠ°ΡΡΠΊ Π² ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° ΠΈΠΌΠ° ΠΏΡΠ±Π»ΠΈΡΠ΅Π½ ΠΊΠ»ΡΡ Π½Π° ΡΡΠ·Π΄Π°ΡΠ΅Π»Ρ Π½Π° Π±Π»ΠΎΠΊΠ°, ΠΏΠΎΠ΄ΠΏΠΈΡ Π½Π° ΡΡΠ·Π΄Π°ΡΠ΅Π»Ρ, Π²Π΅ΡΡΠΈΡ Π½Π° Π±Π»ΠΎΠΊΠ°, Π±ΡΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Π² Π±Π»ΠΎΠΊΠ° ΠΈ ΡΠ°ΠΌΠΈΡΠ΅ ΡΠ΅Π·ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ:
ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π±Π»ΠΎΠΊ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° block.NewBlock(): NewBlock(prevBlockHash string, height int) *ΠΠ»ΠΎΠΊ, ΠΊΠΎΠΉΡΠΎ Π²Π·Π΅ΠΌΠ° Ρ
Π΅ΡΠ° Π½Π° ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ Π±Π»ΠΎΠΊ ΠΈ Π·Π°Π΄Π°Π΄Π΅Π½Π°ΡΠ° Π²ΠΈΡΠΎΡΠΈΠ½Π° Π·Π° ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊ Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°. Π’ΠΈΠΏΡΡ Π±Π»ΠΎΠΊ ΡΡΡΠΎ ΡΠ΅ Π·Π°Π΄Π°Π²Π° ΠΎΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°ΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠΈΠΏΠΎΠ²Π΅:
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() Π΅ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π·Π° 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