블록체인 생성 v1
3150 단어 블록체인단순화블록체인의 지식과 수동 실현
block.go
package main
import (
"time"
"crypto/sha256"
"bytes"
)
//
type Block struct{
Version int64
PrevBlockHash []byte
Hash []byte
TimeStamp int64
TargetBits int64
Nonce int64
MerKelRoot []byte
Data []byte
}
//
func NewBlock(data string, prevBlockHash []byte) *Block{
block := &Block{
Version:1,
PrevBlockHash:prevBlockHash,
//Hash:
TimeStamp:time.Now().Unix(),
TargetBits:10,
Nonce:5,
MerKelRoot:[]byte{},
Data:[]byte(data),
}
block.SetHash() //
return block
}
//
func (block *Block)SetHash(){
tmp := [][]byte{
// int byte
IntToByte(block.Version),
block.PrevBlockHash,
IntToByte(block.TimeStamp),
block.MerKelRoot,
IntToByte(block.Nonce),
block.Data,
}
// , 【】byte{} ,
data := bytes.Join(tmp,[]byte{})
// sha256 , [32]byte ,
hash := sha256.Sum256(data)
block.Hash = hash[:]//
}
// ,
func NewGenesisBlock() *Block{
return NewBlock("Genesis Block!",[]byte{})
}
blockchain.go
package main
import "os"
//
type BlockChain struct{
blocks []*Block
}
// ,
func NewBlockChain() *BlockChain{
return &BlockChain{[]*Block{
NewGenesisBlock(),
}}
}
//
func (bc *BlockChain)AddBlock(data string){
//
if len(bc.blocks) <= 0 {
os.Exit(1)
}
// ,
lastblock := bc.blocks[len(bc.blocks)-1]
prevBlockHash := lastblock.Hash
block := NewBlock(data, prevBlockHash)
//
bc.blocks = append(bc.blocks, block)
}
utils
package main
import (
"bytes"
"encoding/binary"
"fmt"
"os"
)
func IntToByte(num int64)[]byte{
var buffer bytes.Buffer
err := binary.Write(&buffer, binary.BigEndian, num)
//if err != nil{
// fmt.Println("IntToByte err occur:",err)
// os.Exit(1)
//}
CheckErr(err)
return buffer.Bytes()
}
func CheckErr(err error){
if err != nil{
fmt.Println("err occur:",err)
os.Exit(1)
}
}
main.go
package main
import "fmt"
func main(){
bc := NewBlockChain()
bc.AddBlock(" ")
bc.AddBlock(" ")
for i, block := range bc.blocks{
fmt.Println("====block num:", i)
fmt.Printf("Data:%s
", block.Data)
fmt.Println("Version:",block.Version)
fmt.Printf("PrevHash:%x
",block.Version)
fmt.Printf("Hash:%x
",block.TimeStamp)
fmt.Printf("TimeStamp:%d
",block.TimeStamp)
fmt.Printf("MerKel:%x
",block.MerKelRoot)
fmt.Printf("Nonce:%d
",block.Nonce)
}
}
마지막으로 gopath 경로에서 보기 효과를 컴파일합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Azure Blockchain Service를 사용해보십시오.2(컨트랙트 배포)에서는 Azure Blockchain Service를 사용하여 블록체인을 구축할 때까지 했습니다. 이번 기사에서는 구축한 블록체인에 대해 계약(이번에는 ERC20의 토큰 계약)을 배포합니다. Azure Blockch...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.