主页 > 怎么看出来imtoken真伪 > 2020区块链golang版(一)
2020区块链golang版(一)
封面
甜点
现在无论是区块链还是深度神经网络,我个人感觉都是大量比较底层的计算组合而成。 使用大量简单逻辑实现复杂逻辑模拟的过程。
golang-gopher.png
做多
昨天我用 Rust 写了一个简单的区块链。 大家可能觉得这连个区块链玩具都算不上,那么今天我们就用go来实现一个区块链玩具。去年学了一段时间golang,后来因为用处不大就暂时放下了。 最近发现golang这门语言发展很快。 主要参考文献在
所以我们先用golang大致实现区块链,然后再翻译成rust。 我们为什么要做这个? 因为网上直接用rust写区块链的资料不多,即使有也比较简陋。 演示。 如果我们要写出一个完整的区块链,我们需要对它有一个整体的了解,然后我们只需要熟悉它的业务流程就可以了。 不管用什么语言我们基本都能实现,所以我们先了解区块链,然后再设计区块链。 区块链系统基本上是仿照比特币来做这个系统的。
之前零星学过一点区块链的代码,但是具体如何实现比特币发行量多少,交易广播,同步数据,都不是很清楚,所以从今天开始系统的学习一下,补充一下自己的学习
初见区块链
在这里我们可以直观的理解什么是区块链。 一个区块对应交易数据,即以区块的形式记录交易数据,然后将存储交易数据的区块写入区块链。 那么区块链可以理解为一个数据库,区块可以理解为数据库中的每一条记录,只是形式不同而已。 不足以注意到每个块可以包含多个交易或零个交易。
注意比特币发行量多少,相邻块之间的关系只是逻辑关系,并不代表它们在物理存储地址上不一定相邻。
下面介绍区块链出现的术语
那么这些块是如何连接的呢? 这里的每个区块都会生成一个哈希值,只要当前区块保存了前一个区块的哈希值,它们就会保持联系。 这就是块如何链接在一起形成区块链。 有点像链表结构。 每个哈希值都对应着区块的内容,因为每个区块的内容都不一样,所以每个区块的哈希值都是唯一的。
会计账簿.jpg
簿记概念
因为区块中包含交易数据,所以将区块写入区块链的过程有点类似于记账的过程。 那么让我们看看什么是会计。 我们先来看传统的簿记,就是记录交易。 账本就是按时间顺序逐行逐页记录交易。那么我们来看看比特币是如何记账的
如上所述,由于容量和时间限制,全球每秒将有 7-8 笔交易。 这是因为比特币不能用于商业用途。
区块高度
即区块在整个区块链中的位置。
账本
比特币中使用的是谷歌的开源 LevelDB 数据库
leveldb.png
钱包
在比特币钱包中包含地址和私钥
我们的比特币客户端帮助我们维护这些地址和私钥,所以我们通常将客户端视为钱包。 每次比特币转账,系统都会生成一个新的地址和私钥。 钱包里只放银行卡,只要有人的地方。
节点
比特币网络由一个个节点组成。 节点根据账本是否满分为轻节点和全节点。 轻节点只会下载与自己相关的交易。 我们在移动端使用的客户端是轻节点,整个账本可能要300G。
比特币挖矿.jpg
矿业
我们只知道区块链的本质就是将存储交易信息的区块记录到区块链进程中,那么谁来完成这个动作。 即写入数据库的动作,那么大家完成记账的动机是什么? 那么什么样的节点才有资格进行记录。
我们获得记账资格的过程就是挖矿,使用电脑就是矿工。 那么挖矿的驱动力就是系统奖励,系统用奖励给比特币作为发行货币的手段。 我们正在看一部关于比特币的纪录片,并不清楚正在运行什么样的工厂机器来获得比特币。 而奖励是不断递减的,所以比特币的流通量是有上限的,这就是比特币的价值所在。
为什么叫挖矿,因为竞争记账过程的奖励是一种新的货币,也就是类似于稀有资源产生的货币。 挖矿同时消耗大量的电力和硬件资源。 其实挖矿是不产生任何价值的,仔细想想也是一种浪费。
矿机比特币系统参数出块时间
系统根据当前时间动态调整难度值(每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 万
区块容量
最大区块大小为1M,包含约4000笔交易
每秒营业额
4200/600s = 7 个事务/秒
单元
1BTC = 10**8sat