GO言語は、POWマイニングの原則を実装するだけです。

序文

これは、ブロックチェーンマイニングへの好奇心から生まれたものです。最近、GO言語の学習に夢中になり、それを使って単にパウマイニングの原理を実装しました。

コード実装プロセス

ブロック情報構造を定義します。

type Block struct {
	//当前区块的Hash值.
	HashCode string
	//当前时间戳.
	TimeStamp string
	//当前长度.
	Index int
	//网络难度系数,若前导0个数符合难度系数,则挖矿成功,根据挖矿人数不断变化.
	Diff int
	//下一个区块的Hash值
	PreHashCode string
	//随机数
	Nonce int
	//交易信息.
	Data string
}

ジェネシスブロックを作成する

func initFirstBlock() *Block{
	var firstBlcok = new(Block)
	firstBlcok.TimeStamp = string(time.Now().UnixNano())
	firstBlcok.Diff = 3
	firstBlcok.Nonce = 1
	firstBlcok.PreHashCode = "0"
	firstBlcok.Data = "创世块"
	firstBlcok.Index = 1
	for ; ;  {
		hashCode := generateHashCode(*firstBlcok)
		fmt.Println(hashCode)
		if strings.HasPrefix(hashCode, strings.Repeat("0", firstBlcok.Diff)) {
			firstBlcok.HashCode = hashCode
			break
		}else {
			firstBlcok.Nonce++
		}
	}
	fmt.Println("创世模块初始化完毕")
	return firstBlcok
}

ハッシュ値を生成するためのツール

ブロックでHashCodeを生成するために使用されます 

//计算hash值.
func generateHashCode(block Block) string {
    //生成规则.
	record := strconv.Itoa(block.Index) + block.TimeStamp +
		strconv.Itoa(block.Nonce) + strconv.Itoa(block.Diff) + block.PreHashCode
	hash := sha256.New()
	hash.Write([]byte(record))
	sum := hash.Sum(nil)
	hashCode := hex.EncodeToString(sum)
	return hashCode
}

ブロックを取得したら、チェーンの作成を開始します

type Node struct {
	block Block
	nextBlock Block
	index int
}

func initFirstChain(block *Block) *Node {
	node := new(Node)
	node.index = 1
	return node
}

func createNextNode(block Block,node *Node) *Node {
	nextNode := new(Node)
	nextNode.index = node.index + 1
	node.nextBlock = block
	return nextNode
}

POWマイニング

func calNextBlock(diff int, block *Block) Block {
	nextBlock := new(Block)
	nextBlock.Index = block.Index + 1
	nextBlock.TimeStamp = string(time.Now().UnixNano())
	marshal, _ := json.Marshal(block)
	nextBlock.Data = string(marshal)
	nextBlock.Diff = diff
	nextBlock.PreHashCode = block.HashCode

	for ; ;  {
		hashCode := generateHashCode(*nextBlock)
		fmt.Println(hashCode)
		if strings.HasPrefix(hashCode, strings.Repeat("0", nextBlock.Diff)) {
			nextBlock.HashCode = hashCode
			break
		}else {
			nextBlock.Nonce++
		}
	}
	fmt.Println("挖矿成功!!!")
	return *nextBlock
}

メイン機能

func main() {
	now := time.Now()
	//初始化创世模块
	firstBlock := initFirstBlock()
	//初始化链表
	chain := initFirstChain(firstBlock)
	//开始挖坑
	block := calNextBlock(6, firstBlock)
	node := createNextNode(block, chain)
	fmt.Println(node)
	elapsed := time.Since(now)
	fmt.Println("用时:", elapsed)
}

試験結果

総括する

diffの値は、マイニングの難易度を決定します。システムは、マイニングが成功したことを示すために修飾されたハッシュ値が衝突するまで、diffの値に従ってハッシュ衝突を継続的に実行します。その後、このブロックがアップロードされ、に更新されます。鎖。

おすすめ

転載: blog.csdn.net/weixin_39886135/article/details/112984367