甜点
现在无论是区块链还是深度神经网,个人感觉都是一种大量相对低级计算组合。用大量简单逻辑来实现对复杂逻辑的模拟的过程。
golang-gopher.pnggolong
昨天用 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。
挖矿
我们只到区块链本质就是将保存交易信息的区块记入到区块链过程,那么这个动作是由谁来完成的。也就是写入数据库的动作,那么大家完成记账的动力是什么?那么什么样的节点有记录的资格。
我们要获取记账资格的过程就是挖矿,使用计算机就是矿工。那么挖矿的动力就是系统奖励,同时系统利用奖励给出比特币做一种发行货币的手段。我们在看一个关于比特币的纪录片,还不清楚哪些在类似厂房机器不断运转来获取比特币。而且奖励是不断衰减的,所以比特币发行量是有上限的,这也就是比特币价值所在。
为什么叫挖矿,因为竞争记账过程得到奖励是新的货币,也就是类似从稀有资源中产生的货币。挖矿同时消费掉大量电力和硬件资源,其实挖矿并没有产生任何价值,仔细想也是一种浪费。
- 每个区块的数据不是完全一样
- 每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
网友评论