Како сам дизајнирао блокове и трансакције у мом Го блоцкцхаину

Да бисмо на крају добили блок ланац, а не само базу података, морамо да додамо 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).

ЦлосеДБ() је омотач за дб.Цлоце() - позива се након рада са функцијама пакета за затварање везе са базом података.

Функција грешке СетТаргетБлоцкХасх(хасх стринг) записује хеш тренутног блока са кључем специфицираним константом БЛОЦК_ХАСХ у базу података.

Функција ГетТаргетБлоцкХасх() (стринг, грешка) враћа хеш тренутног блока ускладиштеног у бази података.

Функција грешке СетТаргетБлоцкХеигхт(хеигхт инт) уписује у базу података вредност висине ланца блокова за чвор са кључем специфицираним константом БЛОЦК_ХЕИГХТ.

Функција ГетТаргетБлоцкХеигхт() (инт, еррор) враћа висину ланца блокова за дати чвор, ускладиштену у бази података.

ЦхецкБлоцк(блоцк ИБлоцк) боол функција проверава исправност блока пре додавања овог блока у ланац блокова.

Функција грешке АддБлоцк(блоцк ИБлоцк) додаје блок у ланац блокова.

Функције за преузимање и преглед блокова налазе се у датотеци екплоре.го блокчејн пакета:

Функција ГетБлоцкБиХасх(хасх стринг) (*блоцк.Блоцк, грешка) креира празан блок објекат, учитава блок у њега из базе података, чији хеш јој је прослеђен, и враћа показивач на њега.

Креирање генесис блока се врши помоћу функције грешке Генесис() из датотеке генесис.го блокчејн пакета.

Следећи чланак ће говорити о повезивању клијената са чвором помоћу механизма ВебСоцкет.

Извор: ввв.хабр.цом

Додај коментар