Go ๋ธ”๋ก์ฒด์ธ์—์„œ ๋ธ”๋ก๊ณผ ํŠธ๋žœ์žญ์…˜์„ ์„ค๊ณ„ํ•œ ๋ฐฉ๋ฒ•

๊ถ๊ทน์ ์œผ๋กœ ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹Œ ๋ธ”๋ก์ฒด์ธ์œผ๋กœ ๋๋‚˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์— 3๊ฐ€์ง€ ์ค‘์š”ํ•œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ธ”๋ก ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค๋ช…
  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ํŠธ๋žœ์žญ์…˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค๋ช…
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ธ”๋ก์„ ์ €์žฅํ•˜๊ณ  ํ•ด์‹œ๋‚˜ ๋†’์ด(๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ)๋กœ ๋ธ”๋ก์„ ์ฐพ๋Š” ๋ธ”๋ก์ฒด์ธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

Go ๋ธ”๋ก์ฒด์ธ์—์„œ ๋ธ”๋ก๊ณผ ํŠธ๋žœ์žญ์…˜์„ ์„ค๊ณ„ํ•œ ๋ฐฉ๋ฒ•

์‚ฐ์—…์šฉ ๋ธ”๋ก์ฒด์ธ์— ๊ด€ํ•œ ๋‘ ๋ฒˆ์งธ ๊ธ€์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

์ด ์‹œ๋ฆฌ์ฆˆ์˜ ์ด์ „ ๊ธฐ์‚ฌ์— ๋Œ€ํ•ด ๋…์ž๋“ค์ด ๋‚˜์—๊ฒŒ ๋ฌผ์—ˆ๋˜ ์งˆ๋ฌธ์„ ๊ธฐ์–ตํ•˜๋ฉด์„œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ 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) string์€ 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) *Block. ์ด ํ•จ์ˆ˜๋Š” ์ด์ „ ๋ธ”๋ก์˜ ํ•ด์‹œ์™€ ๋ธ”๋ก์ฒด์ธ์—์„œ ์ƒ์„ฑ๋œ ๋ธ”๋ก์— ๋Œ€ํ•ด ์„ค์ •๋œ ๋†’์ด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋ธ”๋ก ์œ ํ˜•์€ ์œ ํ˜• ํŒจํ‚ค์ง€ ์ƒ์ˆ˜์—์„œ๋„ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

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(ํ•ด์‹œ ๋ฌธ์ž์—ด) ์˜ค๋ฅ˜ ํ•จ์ˆ˜๋Š” BLOCK_HASH ์ƒ์ˆ˜๋กœ ์ง€์ •๋œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋ธ”๋ก์˜ ํ•ด์‹œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์”๋‹ˆ๋‹ค.

GetTargetBlockHash()(๋ฌธ์ž์—ด, ์˜ค๋ฅ˜) ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ํ˜„์žฌ ๋ธ”๋ก์˜ ํ•ด์‹œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

SetTargetBlockHeight(height int) ์˜ค๋ฅ˜ ํ•จ์ˆ˜๋Š” BLOCK_HEIGHT ์ƒ์ˆ˜๋กœ ์ง€์ •๋œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์˜ ๋ธ”๋ก์ฒด์ธ ๋†’์ด ๊ฐ’์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

GetTargetBlockHeight() (int, error) ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ํŠน์ • ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ธ”๋ก์ฒด์ธ์˜ ๋†’์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

CheckBlock(block IBlock) bool ํ•จ์ˆ˜๋Š” ๋ธ”๋ก์„ ๋ธ”๋ก์ฒด์ธ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๋ธ”๋ก์˜ ์ •ํ™•์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

AddBlock(๋ธ”๋ก IBlock) ์˜ค๋ฅ˜ ๊ธฐ๋Šฅ์€ ๋ธ”๋ก์ฒด์ธ์— ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ณด๋Š” ๊ธฐ๋Šฅ์€ ๋ธ”๋ก์ฒด์ธ ํŒจํ‚ค์ง€์˜ explore.go ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค.

GetBlockByHash(ํ•ด์‹œ ๋ฌธ์ž์—ด) (*block.Block, error) ํ•จ์ˆ˜๋Š” ๋นˆ ๋ธ”๋ก ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด์‹œ๊ฐ€ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๋กœ ๋ธ”๋ก์„ ๋กœ๋“œํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค์‹œ์Šค ๋ธ”๋ก ์ƒ์„ฑ์€ ๋ธ”๋ก์ฒด์ธ ํŒจํ‚ค์ง€์˜ Genesis.go ํŒŒ์ผ์— ์žˆ๋Š” Genesis() ์˜ค๋ฅ˜ ํ•จ์ˆ˜์— ์˜ํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ๋Š” WebSocket ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋…ธ๋“œ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€