Как ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Ρ… Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² моя Go blockchain

Π—Π° Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈΠΌ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка с Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½, Π° Π½Π΅ само с Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, трябва Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ 3 Π²Π°ΠΆΠ½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° към нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

  • ОписаниС Π½Π° структурата Π½Π° Π±Π»ΠΎΠΊΠΎΠ²ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅
  • ОписаниС Π½Π° структурата Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° транзакция
  • Π‘Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ записват Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π² Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π³ΠΈ Π½Π°ΠΌΠΈΡ€Π°Ρ‚ Ρ‚Π°ΠΌ ΠΏΠΎ тСхния Ρ…Π΅Ρˆ ΠΈΠ»ΠΈ височина (ΠΈΠ»ΠΈ Π½Π΅Ρ‰ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ).

Как ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Ρ… Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π² моя Go blockchain

Π’ΠΎΠ²Π° Π΅ Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° статия Π·Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ Π·Π° индустрията, ΠΏΡŠΡ€Π²Π°Ρ‚Π° Ρ‚ΡƒΠΊ.

Бпомняйки си Π²ΡŠΠΏΡ€ΠΎΡΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ ΠΌΠΈ Π·Π°Π΄Π°Π΄ΠΎΡ…Π° относно ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° статия ΠΎΡ‚ Ρ‚Π°Π·ΠΈ ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π°, трябва Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ: Π² Ρ‚ΠΎΠ·ΠΈ случай Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ LevelDB сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ Π΄Π°Π½Π½ΠΈ, Π½ΠΎ Π½ΠΈΡ‰ΠΎ Π½Π΅ Π²ΠΈ ΠΏΡ€Π΅Ρ‡ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ всяка Π΄Ρ€ΡƒΠ³Π°, Π΄Π° Ρ€Π΅Ρ‡Π΅ΠΌ, 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), Ρ…Π΅ΡˆΠ° Π½Π° Ρ‚Π°Π·ΠΈ транзакция, Ρ‚ΠΈΠΏΠ° Π½Π° самата транзакция, ΠΊΠ»Π΅ΠΉΠΌΠΎ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ ΠΈ Π²Ρ…ΠΎΠ΄ΠΎΠ²Π΅ ΠΈ ΠΈΠ·Ρ…ΠΎΠ΄ΠΈ. 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 сравнява получСния Ρ…Π΅Ρˆ ΠΎΡ‚ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° Ρ…Π΅Ρˆ Π½Π° транзакцията с Ρ…Π΅ΡˆΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ…Π΅ΡˆΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°Π·ΠΈ транзакция (ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅Π³Π²Π°ΠΉΠΊΠΈ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° Ρ…Π΅Ρˆ).

Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈΡ‚Π΅ сС добавят към Π±Π»ΠΎΠΊΠ°: 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 Π΅ ΠΊΠΎΡ€Π΅Π½ΡŠΡ‚ Π½Π° Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ 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.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π½Π° Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ ΠΏΠ°ΠΊΠ΅Ρ‚Π° отговарят Π·Π° записа Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½: 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(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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€