Доказательство работы (PoW) — это алгоритм, используемый для достижения консенсуса в распределенных сетях. Впервые он был предложен Синтией Дворк и Мони Наор в 1993 году и применен к технологии блокчейна Сатоши Накамото в официальном документе Биткойна. В сети блокчейнов PoW используется для обеспечения безопасности и согласованности данных сети блокчейнов.
Основная идея PoW — позволить участникам сети (часто называемым майнерами) доказать, что они выполнили определенный уровень вычислительной работы, решив сложную математическую задачу. Математическая проблема обычно состоит в том, чтобы найти значение хеш-функции, отвечающее определенным критериям. Только когда будет найдено значение хеш-функции, отвечающее условиям, майнеры смогут добавлять новые блоки в блокчейн и получать соответствующие вознаграждения.
целевая Характер — это динамически настраиваемое значение, используемое для управления временным интервалом генерации блоков. целевая Чем выше сложность, тем сложнее найти хэш, соответствующий критериям, что увеличивает сложность вычислений и время. В сети Bitcoin целевая сложность Корректируется примерно каждые две недели,Чтобы гарантировать, что один блок генерируется в среднем каждые 10 минут.
Ниже приведен простой пример PoW, реализованный на языке Go, включая определение блока, алгоритм доказательства работы и процесс проверки.
package main
import (
"bytes"
"crypto/sha256"
"encoding/binary"
"fmt"
"math"
"math/big"
"time"
)
// Определите блок, включая заголовок блока, поля данных и доказательства работы.
type Block struct {
Timestamp int64
Data []byte
PrevBlockHash []byte
Hash []byte
Nonce int
}
// Определить структуру PoW, включая целевую сложностьи блокируют информацию
type ProofOfWork struct {
Block *Block
Target *big.Int
}
// Создайте новый объект доказательства работы, установите целевую сложность。целевая Чем выше сложность, тем сложнее добывать.
const targetBits = 24
func NewProofOfWork(block *Block) *ProofOfWork {
target := big.NewInt(1)
target.Lsh(target, uint(256-targetBits))
pow := &ProofOfWork{block, target}
return pow
}
// Выполнить хеш-расчеты
func (pow *ProofOfWork) prepareData(nonce int) []byte {
data := bytes.Join(
[][]byte{
pow.Block.PrevBlockHash,
pow.Block.Data,
IntToHex(pow.Block.Timestamp),
IntToHex(int64(targetBits)),
IntToHex(int64(nonce)),
},
[]byte{},
)
return data
}
func IntToHex(n int64) []byte {
buff := new(bytes.Buffer)
err := binary.Write(buff, binary.BigEndian, n)
if err != nil {
fmt.Println("binary.Write failed:", err)
}
return buff.Bytes()
}
// Горное дело
func (pow *ProofOfWork) Run() (int, []byte) {
var hashInt big.Int
var hash [32]byte
nonce := 0
fmt.Printf("Mining the block containing \"%s\"\n", pow.Block.Data)
for nonce < math.MaxInt64 {
data := pow.prepareData(nonce)
hash = sha256.Sum256(data)
fmt.Printf("\r%x", hash)
hashInt.SetBytes(hash[:])
if hashInt.Cmp(pow.Target) == -1 {
break
} else {
nonce++
}
}
fmt.Print("\n\n")
return nonce, hash[:]
}
заявление:Эта работа принимаетС указанием авторства-Некоммерческая-ShareAlike 4.0 интернациональность (CC BY-NC-SA 4.0)Дать разрешение,При использовании указывайте источник.
blog: mengbin
Github: mengbin92
cnblogs: Влюбиться в воду невольно
Сообщество разработчиков облачных технологий Tencent:Мюнстер