1.原理与补充知识
1.big.Int 的一些常见方法和属性:
-
SetInt64(x int64):将一个int64类型的整数赋值给big.Int。 -
SetString(s string, base int):将一个字符串表示的整数按照指定的进制转换为big.Int。 -
SetBytes(x )(s string):讲一个字节型变量转换成big.Init
-
Add(x, y *big.Int) *big.Int:将两个big.Int相加,并返回结果。 -
Sub(x, y *big.Int) *big.Int:将一个big.Int减去另一个big.Int,并返回结果。 -
Mul(x, y *big.Int) *big.Int:将两个big.Int相乘,并返回结果。 -
Div(x, y, z *big.Int) *big.Int:将一个big.Int除以另一个big.Int,并返回商。 -
Mod(x, y, z *big.Int) *big.Int:将一个big.Int对另一个big.Int取模,并返回结果。 -
Cmp(y *big.Int) int:将big.Int与另一个big.Int比较,返回 -1、0 或 1,分别表示小于、等于或大于。
2.Target,nonce和PoW
target本质上是一个和SHA256生成哈希值一样大的整数
特殊的是这个数前几位都是0
我们要求,通过反复枚举nonce,生成一个小于target的数字。这样新产生的区块是成立的(即前面0个数大于等于)
这一过程被称为:工作量证明(PoW算法)
3.SHA256的充足性
sha256生成的哈希值256二进制位,有大约是1.157920892×10^77种可能
而我们要求一个区块链中的区块哈希值不能相同,这个算法产生的值重复的概率几乎为零
哪怕是满足target限制的hash值也是
2.源代码
package main
import (
"bytes"
"crypto/sha256"
"encoding/binary"
"fmt"
"log"
"math"
"math/big"
"time"
)
type Block struct {
Timestamp int64
Hash []byte
PrevHash []byte
Target []byte
Nonce int64
Data []byte
}
const (
Difficulty = 12
)
func (b *Block) GetTarget() []byte {
target := big.NewInt(1)
target.Lsh(target, uint(256-Difficulty))
return target.Bytes(
深入理解区块链:big.Int在比特币挖矿中的应用与SHA256算法的运用

最低0.47元/天 解锁文章
834

被折叠的 条评论
为什么被折叠?



