1

2020 区块链 golang 版本(1)

 1 year ago
source link: https://studygolang.com/articles/28110?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

现在无论是区块链还是深度神经网,个人感觉都是一种大量相对低级计算组合。用大量简单逻辑来实现对复杂逻辑的模拟的过程。

golang-gopher.png

golong

昨天用 rust 写了一个简单区块链,可能大家认为这个连一个区块链玩具都算不上,那么今天我们就用 go 来实现一个区块链玩具。去年学了一段 golang ,然后因为没有派上用场就暂时放下了,最近发现 golang 这门语言发展迅速,主要引用在

  • 容器,docker 其实是 golang 的第一个最佳实践
  • BS 的服务端
  • golang 对区块链实现也不少

所以我们先用 golang 将区块链大体实现一下,然后将其翻译为 rust,为什么这么做呢?因为网上直接用 rust 写区块链的资料没有找到多少,即使有也比较初级,多说也就是 demo。想要写一个完整区块链,我们需要先对其有一个整体认识,然后只有熟悉其业务流程,我们无论用那种语言基本都是实现,所以我们先了解区块链,然后再设计一个区块链系统,基本是仿照比特币来做这个系统。

之前零散地学习过一点区块链代码,但是对于如何实现、交易广播和同步数据这些内容还不算清楚,所以从今天开始我们对其有一个系统学习。补全自己的学习

初见区块链

这里我们可以直观理解一下什么是区块链,区块(block)对应交易数据,也就是将交易数据以块形式记录,然后将保存交易数据的块写入到区块链。那么区块链可以理解为数据库,而区块可以理解为数据库每条记录,只不过形式不同。不够注意每一个块可包含多条交易或者也可以是 0 条交易。

注意相邻的区块之间关系只是逻辑上关系,并不代表他们之间在物理存储地址并不一定相邻。

下面对区块链出现术语进行描述

那么这些区块是如何连接的呢?这里每一个区块都会产生一个 hash,只要当前区块保存了上一个区块的 hash 值他们就保持了联系。区块就是这样连接在一起形成区块链的。有点类似链表结构。每一个 hash 值对应区块内容,因为每一个区块内容不同所以每一个区块 hash 值都是唯一的。

accounting-books.jpg

因为区块中包含交易数据,所以写入区块到区块链过程有点类似记账的过程。那么我们就看看什么是记账。我们先看传统的记账,记账就是记录交易。账本就是按时间顺序逐行逐页进行记录交易。然后我们在看一看在比特币如何记账

  • 数据块大小上限为 1 M
  • 按块进行记账,有点类似账本每一页
  • 而且块产生需要有一定时间间隔
  • 所有节点都参与记账
  • 所有节点都拥有记账

终上所述,因为容量和时间上限制,所以大概每秒钟在整个世界范围会产生 7~8 笔交易。这是因为比特币无法商用的行为。

区块的高度

也就是区块在整个区块链的位置。

在比特币中使用是 google 开源 LevelDB 数据库

leveldb.png

在比特币钱包中包含地址私钥

  • 地址: 类似我们钱包中的银行卡号
  • 私钥: 类似每一张银行卡的一个秘密

我们比特币客户端帮助我们维护这些地址和私钥,所以通常我们将客户端看成钱包。在比特币每一次进行转账系统都会新生成一个地址和私钥。钱包中只保存银行卡,只要有人。

节点(node)

比特币网络就是由一个一个的节点所组成。节点根据账本是否全分为轻节点全节点。轻节点只会下载与自己相关的交易。我们在移动端使用客户端就是轻节点,全账本可能要 300 G。

bitcoin-mining.jpg

我们只到区块链本质就是将保存交易信息的区块记入到区块链过程,那么这个动作是由谁来完成的。也就是写入数据库的动作,那么大家完成记账的动力是什么?那么什么样的节点有记录的资格。
我们要获取记账资格的过程就是挖矿,使用计算机就是矿工。那么挖矿的动力就是系统奖励,同时系统利用奖励给出比特币做一种发行货币的手段。我们在看一个关于比特币的纪录片,还不清楚哪些在类似厂房机器不断运转来获取比特币。而且奖励是不断衰减的,所以比特币发行量是有上限的,这也就是比特币价值所在。

为什么叫挖矿,因为竞争记账过程得到奖励是新的货币,也就是类似从稀有资源中产生的货币。挖矿同时消费掉大量电力和硬件资源,其实挖矿并没有产生任何价值,仔细想也是一种浪费。

  • 每个区块的数据不是完全一样
  • 每10分钟只有一个区块产生
  • 如果一个矿工竞争失败,拆分区块中交易数据,过滤掉已经打包过交易,重新打包区块进入下一轮竞争
    以上特点就保证了一致性。
  • CPU 挖矿
  • GPU 挖矿
  • FPGA 挖矿: 可编程逻辑控制器
  • ASIC 挖矿: 这就是比特大陆的产品,矿机组合在一起就是矿池

比特币系统参数

系统根据当前时间动态调整难度值(每2016个块调整一次,约2周)使用时间稳定在 10 分钟左右,

  • 计算时间
    没什么要控制时间来发行块,产生块同时也会以奖励记账的形式来发行货币,所以保证系统问题稳定。安全性和适用性的权衡,十分钟避免频繁发生冲突(分叉)。

最初奖励为 50 个比特币,每 21 万(大约 4 年时间)奖励减半,这样保证发比特币总量

比特币总量

比特币总量约为 2100 万,下面我们通过代码来验证一下这件事

package main

import "fmt"

func main(){
    fmt.Println("hello");
}
package main

import "fmt"

func main(){
    fmt.Println("hello");
    //1. 21 万块奖励进行减半
    //2 最初奖励 50 比特币
    // 循环判断

    total := 0.0
    block_interval := 21.0
    current_reward := 50.0

    for current_reward > 0{
        amount_1 := block_interval * current_reward
        current_reward *= 0.5
        total += amount_1
    }

    fmt.Println("比特币总量: ",total,"万")
}
比特币总量:  2100 万

区块容量最大是 1 M,大约包含 4000 条交易

每秒成交量

4200/600s = 7笔交易/秒

1BTC = 10**8sat


有疑问加站长微信联系(非本文作者)

280

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK