主页 > imtoken冷钱包官方版 > 比特币底层技术解读-区块链(一)-区块原型与工作量证明.docx 12页

比特币底层技术解读-区块链(一)-区块原型与工作量证明.docx 12页

imtoken冷钱包官方版 2023-05-08 07:45:50

比特币——数字加密货币金银银票法币比特币:一串加密数字思考题:我们为什么信任比特币? 没有假钞:如何使它们不可篡改? 无通胀:总量2100万,如何控制发行量? 流通性好:点对点特性 财产由你自己掌控:只有你的私钥才能消费你的比特币 区块链技术不是一种具体的技术,而是多种技术的集合,其本质是一种去中心化的记账系统衍生问题:如果有人篡改本地数据进行作弊怎么办? 如何验证? 既然是会计系统,那我们记录什么? 你为什么要记账? 交易记录 & 奖励区块中的数据其实就是交易记录。 比特币使用 UTXO 模型进行交易记录。 比特币没有余额的概念,不记录谁拥有多少个币,而是交易记录计算的结果。 因为参与记账可以赚取收益,假设有以下交易需要记账: 姓名收入支出张三102 李四52 记账的时候多加一张自己的转账记录姓名收入支出张三102 李四52 Blake12.5 and pack it Block generation, block generation process: packaging: hash(timestamp + prevHash + data) = hash broadcast: 过程是不是太简单了? 工作量证明是为了解决一个数学问题。 需要打包hash比特币的底层关键技术是,给你增加难度。 0000000000000000000046415354d959460bd5290d5870eeac4d02f6a805b1bc 比特币需要前面有 20 个零才合法。 我们知道一个块的内容是固定的。 hash值也是固定的,我们可以加上随机值来改变内容hash(timestamp + prevHash + data + nonce)#nonce是一个随机数来计算难度:hash值是一个64位的十六进制数。

0的概率是1/16,需要计算20个0的16^20次方。 可见计算这样的哈希值需要很大的计算能力。 这个过程就是挖矿比特币的底层关键技术是,也就是用的方法来控制流通量,平均10分钟出一个块。 难度会根据发行总量调整。下面开始执行core/block.gopackage coreimport("crypto/sha256" "encoding/hex" "fmt" "math/big" "math/rand" "strconv" "time ")type Block struct {timestamp int64prevstringdatastringhashstringnonceint}func (b *Block) CalcHash(nonce int) {pack := strconv.FormatInt(b.timestamp, 10) + b.prev + b.data + strconv.FormatInt(int64(nonce) ), 10)hash := sha256.Sum256([ ]byte(pack))b.hash = hex.EncodeToString(hash[:])}func NewBlock(data, prev string) *Block {block := new(Block) block.prev = prevblock.data = datablock.timestamp = time.Now().Unix()target := big.NewInt(1)target.Lsh(target, uint(4*(64-4)))hashInt := big.NewInt(0)rand.Seed(time.Now().UnixNano())nonce := rand.Int()fmt.Printf("记录\"%s\"开始挖矿...\n", block.data)startTime := time.Now() .UnixNano()for {block.CalcHash(nonce)hashInt.SetString(block.hash, 16)if hashInt.Cmp(target) == -1 {break} else { fmt.Printf("\r%s", block .hash)}nonce = rand.Int()}block .nonce = nonceendTime := time.Now().UnixNano()fmt.Printf("\r%s\n", block.hash)fmt.Printf(" 完成! [时间:%0.4fs,随机数:%d]\n\n", float32(endTime-startTime)/1000000000, nonce)return block}core/blockchain.gopackage coreimport ("fmt""strings")type BlockChain struct { blocks []*Block}func (bc *BlockChain) Print() {if len(bc.blocks) > 0 {fmt.Println(strings.Repeat("-", 70))fmt.Println("我的区块链" ) fmt.Println(strings.Repeat("-", 70))for _, block := range bc.blocks {fmt.Printf("prev: %s\n", block.prev)fmt.Printf("data : %s\n", block.data)fmt.Printf("hash: %s\n", block.hash)fmt.Println(strings.Repeat("-", 70))}}}func (bc *区块链 ) AddBlock(数据串) {if len(bc.blocks)