Да бисмо на крају добили блок ланац, а не само базу података, морамо да додамо 3 важна елемента нашем пројекту:
- Опис структуре података блока и метода
- Опис структуре података и метода трансакција
- Блоцкцхаин функције које чувају блокове у бази података и тамо их проналазе по њиховом хешу или висини (или нечем другом).
Ово је други чланак о блокчејну за индустрију, први
Сећајући се питања која су ми читаоци поставили о претходном чланку у овој серији, треба напоменути: у овом случају, база података ЛевелДБ се користи за складиштење података о блокчејну, али ништа вас не спречава да користите било који други, рецимо, МиСКЛ. Погледајмо сада структуру ових података.
Почнимо са трансакцијама:
Ево његове структуре података:
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
}
ТКС чува тип података (за трансакцију 2), хеш те трансакције, тип саме трансакције, временску ознаку и улазе и излазе. ТкИн улази чувају хеш трансакције на чији се излаз упућује, број овог излаза и бајт-код, а ТкОут излази чувају неку вредност, а такође и бајткод.
Сада да видимо које радње трансакција може да изврши над својим подацима, тј. Хајде да погледамо методе.
Да бисте креирали трансакцију, користите функцију трансацтион.НевТрансацтион(тктипе бите) *ТКС.
Метода АддТкИн(тхатткхасх []бите, ткоутн инт, цоде []бите) (*ТкИн, еррор) додаје улаз у трансакцију.
Метод АддТкОут(валуе инт, дата []бите) (*ТкОут, грешка) додаје излаз у трансакцију.
Метод ТоБитес() []бите претвара трансакцију у исечак бајтова.
Интерна функција преБитеХасх(битес []бите) стринг се користи у Буилд() и Цхецк() да би генерисани хеш трансакције био компатибилан са хешовима трансакција генерисаним из ЈаваСцрипт апликација.
Метод Буилд() поставља хеш трансакције на следећи начин: тк.ТкХасх = преБитеХасх(тк.ТоБитес()).
Метод стринга ТоЈСОН() претвара трансакцију у ЈСОН стринг.
Метод грешке ФромЈСОН(дата []бите) учитава трансакцију из ЈСОН формата која је прослеђена као бајт исечак.
Цхецк() боол метод упоређује резултујући хеш из хеш поља трансакције са хешом добијеним као резултат хеширања ове трансакције (занемарујући хеш поље).
Трансакције се додају у блок:
Блок структура података је обимнија:
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
}
ДатаТипе чува тип података, чвор га користи и разликује блок од трансакције или других података. За блок ова вредност је 1.
БлоцкХеигхт чува висину блока.
Временска ознака временска ознака.
ХеадерСизе је величина блока у бајтовима.
ПревБлоцкХасх је хеш претходног блока, а СелфБлоцкХасх је хеш тренутног.
ТксХасх је општи хеш трансакција.
МерклеРоот је корен Меркле дрвета.
Даље у пољима се налази јавни кључ креатора блока, потпис креатора, верзија блока, број трансакција у блоку и саме те трансакције.
Погледајмо његове методе:
Да бисте креирали блок, користите функцију блоцк.НевБлоцк(): НевБлоцк(превБлоцкХасх стринг, висина инт) *Блок, који узима хеш претходног блока и висину постављену за креирани блок у ланцу блокова. Тип блока се такође поставља из константе пакета типова:
b.DataType = types.BLOCK_TYPE.
Метода АддТк(тк *трансацтион.ТКС) додаје трансакцију у блок.
Метода Буилд() учитава вредности у поља блока и генерише и поставља његов тренутни хеш.
Метод ТоБитесХеадер() []бите конвертује заглавље блока (без трансакција) у исечак бајтова.
Метод стринга ТоЈСОН() претвара блок у ЈСОН формат у стринг приказу података.
Метод грешке ФромЈСОН(дата []бите) учитава податке из ЈСОН-а у блок структуру.
Цхецк() боол метод генерише хеш блока и упоређује га са оним наведеним у пољу хеш блока.
Метод стринга ГетТксХасх() враћа укупан хеш свих трансакција у блоку.
Метод ГетМерклеРоот() одређује корен Мерклеовог стабла за трансакције у блоку.
Метода Сигн(привк стринг) потписује блок са приватним кључем креатора блока.
Метод СетХеигхт(хеигхт инт) уписује висину блока у поље структуре блока.
Метод ГетХеигхт() инт враћа висину блока како је наведено у одговарајућем пољу структуре блока.
Метод ТоГОББитес() []бите кодира блок у ГОБ формату и враћа га као исечак бајта.
Метод грешке ФромГОББитес(дата []бите) уписује блок податке у структуру блока из прослеђеног бајтног дела у ГОБ формату.
Метод стринга ГетХасх() враћа хеш датог блока.
Метод стринга ГетПревХасх() враћа хеш претходног блока.
Метод СетПублицКеи(пубк стринг) уписује јавни кључ креатора блока у блок.
Тако, користећи методе Блоцк објекта, можемо га лако претворити у формат за пренос преко мреже и чување у ЛевелДБ бази података.
Функције блокчејн пакета су одговорне за чување у блокчејну:
Да би то урадио, блок мора да имплементира ИБлоцк интерфејс:
type IGOBBytes interface {
ToGOBBytes() []byte
FromGOBBytes(data []byte) error
}
type IBlock interface {
IGOBBytes
GetHash() string
GetPrevHash() string
GetHeight() int
Check() bool
}
Веза са базом података се креира једном када се пакет иницијализује у функцији инит():
db, err = leveldb.OpenFile(BLOCKCHAIN_DB_DEBUG, nil).
ЦлосеДБ() је омотач за дб.Цлоце() - позива се након рада са функцијама пакета за затварање везе са базом података.
Функција грешке СетТаргетБлоцкХасх(хасх стринг) записује хеш тренутног блока са кључем специфицираним константом БЛОЦК_ХАСХ у базу података.
Функција ГетТаргетБлоцкХасх() (стринг, грешка) враћа хеш тренутног блока ускладиштеног у бази података.
Функција грешке СетТаргетБлоцкХеигхт(хеигхт инт) уписује у базу података вредност висине ланца блокова за чвор са кључем специфицираним константом БЛОЦК_ХЕИГХТ.
Функција ГетТаргетБлоцкХеигхт() (инт, еррор) враћа висину ланца блокова за дати чвор, ускладиштену у бази података.
ЦхецкБлоцк(блоцк ИБлоцк) боол функција проверава исправност блока пре додавања овог блока у ланац блокова.
Функција грешке АддБлоцк(блоцк ИБлоцк) додаје блок у ланац блокова.
Функције за преузимање и преглед блокова налазе се у датотеци екплоре.го блокчејн пакета:
Функција ГетБлоцкБиХасх(хасх стринг) (*блоцк.Блоцк, грешка) креира празан блок објекат, учитава блок у њега из базе података, чији хеш јој је прослеђен, и враћа показивач на њега.
Креирање генесис блока се врши помоћу функције грешке Генесис() из датотеке генесис.го блокчејн пакета.
Следећи чланак ће говорити о повезивању клијената са чвором помоћу механизма ВебСоцкет.
Извор: ввв.хабр.цом