2020 区块链 golang 版本(1)

zidea · · 2194 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

封面

甜点

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

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


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

本文来自:简书

感谢作者:zidea

查看原文:2020 区块链 golang 版本(1)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2194 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传