"jeiwan's blockchain go"에서 학습한것을 정리하여 기록하였습니다.
Description : https://jeiwan.net/posts/building-blockchain-in-go-part-1/
Source : https://github.com/Jeiwan/blockchain_go/tree/part_1
블록체인은 기본적으로 블록과 블록을 연결한것을 말한다. 여기서 블록B는 블록A의 hash값을 저장하고 자신의 Hash값을 만드는곳에 사용함으로 BlckA의 변경이 BlockB가 생성된 후 발생한다면 연결이 끊어짐을 의미한다.
type Block struct {
Timestamp int64
Data []byte
PrevBlockHash []byte
Hash []byte
}
Timestapm : 블록 생서 시간
Data : 저장 정보
PrevBlockHash : 이전의 블록의 Hash값
hash : sha256(Timestapm + Data + PrevBlockHash) 값
func NewBlockchain() *Blockchain {
return &Blockchain{[]*Block{NewGenesisBlock()}}
}
(동그라미1) NewBlockchain함수에서는 GenesisBlock이 생선된 배열포인터를 리턴합니다. 여기까지는 bc의 길이는 1입니다.
func (bc *BlockChain) AddBlock(data string) {
prevBlock := bc.blocks[len(bc.blocks)-1]
newBlock := NewBlock(data, prevBlock.Hash)
bc.blocks = append(bc.blocks, newBlock)
}
func NewBlock(data string, prevBlockHash []byte) *Block {
block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
block.SetHash()
return block
}
func (b *Block) SetHash() {
timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
hash := sha256.Sum256(headers)
b.Hash = hash[:]
}
(동그라미2) AddBlock블럭 함수는 위 그림에서 보여주듯이 BlockA의 hash를 BlockB의 hash를 만들때 넣어주는것을 확인 가능하다.
Console 출력
----------------------------------------------------------------------------
Prev. hash:
Data: Genesis Block
Hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168
Prev. hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168
Data: Send 1 BTC to Ivan
Hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1
Prev. hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1
Data: Send 2 more BTC to Ivan
Hash: 561237522bb7fcfbccbc6fe0e98bbbde7427ffe01c6fb223f7562288ca2295d1
실행결과를 아래와 같이 표현가능하다.
그림과 같이 블럭은 다음블럭에게 생성에 영향을 주며, 이전 블록의 정보를 가지게 된다. 이런식으로 엮여 있어 체인이랑 단어를 사용하여 블록체인이라고 부른다. 또한 블럭은 이전 블럭의 hash값을 가지고 있기에 변경 유무를 확인 가능하다. 예로 fisrt block에서 내용의 변경이 있었다면, second block에서 저장된 prevBlockHash값으로 fisrt block의 변경 유무를 검증 가능하다.
제가 찾던 정보에요!