区块链技术已经有很久了,但是目前区块链相关的技术博客不多,鱼龙混杂,我在学习的过程中,很少能找到有用的东西。尤其是区块链的知识原理,更是少之又少。学习的时候也是一头雾水。现在我分享一下我学区块链的思路。
在开始之前,有一个很重要的东西需要说:如果要学习区块链开发,你学习的第一步是学习区块链的原理!!!只有知道原理,你才能在之后的开发中解决问题,尤其是想进阶一定要掌握底层原理。
1.什么是区块链
区块链,从名字上觉得这是一个链状的东西,那么具体是怎么个链发呢?其实是数据存储的链,区块链的挖矿节点将交易数据验证完合法性后按照区块链协议进行打包,并把自己打的包串在链上。串在链上的方式类似于c++的链表,只不过每个链标记上一个区块的地方是哈希指针,即能找到上一个区块也能验证上一个区块的数据。这样将数据串联在一起形成的链就是区块链内的数据,区块链本身不只是数据,还有协议。协议是定义在区块链的文档内的,然后在实现区块链的时候,程序员按照协议的要求把协议转换为区块链的规则。
这里推荐一个区块链比较好的视频:哔哩哔哩搜索【北京大学肖臻老师《区块链技术与应用》公开课】,讲的太精彩了。视频包含区块链原理、密码学等等,看完这个再来学区块会特别轻松。
2.区块链工作原理
整体上来说,区块链是一个记账过程,这个账可以是任何数据的记账。但是这个记账是有特点的。首先有人交易了,就把这个交易广播到所有节点,节点把交易放到交易池里面,然后更具优先算法,选择先验证哪些交易,验证交易就是看一看这个交易合法性,有没有伪造信息,验证完后放到区块里面。区块大小是有限制的,当交易的数量填满一个区块的时候,需要对区块进行打包。这个打包也是有要求的,要满足打包后的哈希值满足一定的规则。为了满足这个规则,就要求我们朝包里面加一些额外的东西,调整数据来满足规则,加什么才能满足呢?这个谁也不确定,只能不停重复尝试不同的内容,直到找到一个合适的东西。打包完成后,几点就把包广播出去,其他节点验证这个包是不是合法的,再验证包里面的交易是不是合法的,如果验证通过,就把这个包在自己本地的链上写上去,然后更新自己交易池,把已经打包的交易都从交易池去除。这样就完成了一整个过程。
看完这个你会有很多疑问:
首先,节点之间是如何广播的?节点在搭建的时候,需要一个根节点。这个根节是在区块链网络上的任意一个节点。但是一般区块链官方会给几个固定不变的根节点。当我们添加了根节点之后,我们的节点会告诉根节点我是你们的伙伴根几点回吧它知道的所有节点都告诉我们的节点,同时根节点再告诉它认识的其他节点,我这新来了一个小伙伴,节点之间互相转告,就能够保证消息被广播出去,同时节点收到相同的广播消息就自动丢弃,避免消息回环。交易信息的广播也是一样,大家互相转告已达到广播效果。
验证交易合理性是验证些什么?验证交易合理性就是看看交易是不是有效的。比如说A账户给B账户转账100个以太币,那么要看看这个交易有没有A账户的签名(只有账户拥有者可以签名,签名无法伪造),再看看A账户是不是真的有那么多钱,从而避免伪造交易。
区块大小是如何限制的?比特币是直接限制区块的大小,以太坊不一样,以太坊上面每一个交易是有花费的,收费是按照计算步骤收费(例如算一个加法操作需要10gas,一个乘法操作需要100gas),区块大小是限制这个区块只能做1000gas的操作。假如一个交易要执行11个乘法导致需要消耗1100个gas,那么这个区块就不能够打包这个交易会超过打包区块大小。以太坊协议说你区块大小是可以调整的,每次打包可以调整1/2048,如果每个打包节点都觉得小,只要打包2048次之后,包的大小就能扩大一倍。虽然看起来调整幅度很小,但是平均10秒出一个区块的话,这个增长速度就很恐怖了。
区块链的核心思想是去中心化,用大量的节点保证数据安全性和不可篡改性。去中心化的意思是没有哪个节点是中心节点,所有全节点均存储着区块链的完整数据,每一个数据的合法性是由大部分节点共同验证的。
区块链工作原理就是分布在不同地域和网络的计算机,在一个交易发起后,所有机器一起验证交易是否合法,然后把合法的交易打包并且记录,并将打包结果广播给每一个节点,达到大家都在记账并且记账的内容一致。
3.区块链应用
区块链应用主要在金融、重要数据存储等等场合,对比常规项目,区块链项目是把数据库部分变为区块链,使用区块链存储数据代替数据库存储数据,也有混合存储的模式。由于目前公链交易花费比较高,大部分项目落地为联盟链项目或者私链项目。
在项目中,通过使用web3库可以和以太坊客户端交互。
4.区块链的搭建
下载geth客户端,编写创世区块文件,初始化区块链,启动节点、创建账户、开启挖矿。搭建多节点时,每个节点均需要使用创世区块json文件初始化。创建之后需要添加种子节点(已经在链内的任意节点均可)。若两个节点始终不能互通,要么是没有使用同一个创世区块json初始化,要么是没有开发rpc或者防火墙没有开放端口。
注意:正常情况,账户在交易的时候需要解锁,正常情况解锁300miao后自动上锁,若部署智能合约后,需要长期解锁账户的,需要在启动命令添加 --unlock “账户地址” --password "存储解锁账户密码的文件" ,其中存储账户解锁密码的文件可以是一个文本文件,里面只填写你的密码即可。在交易发生后,需要有节点挖矿才能完成数据的上链工作,若整个私链没有挖矿节点,将只能查看区块链数据,但不能写入数据到区块链(包括发布交易)。
若搭建私链,在执行挖矿后,由于我们的交易池基本是空的,区块的gaslimit会随着区块的增减一点点减小到4312388,若需要大量数据存储时,要配置以太坊私链的gasLimit不会自动调整。暂时不知道如何配置,后续会补充。
5.智能合约的开发
目前开发智能合约主要是solidity语言开发,这个语言比较晦涩和反常态,不用很复杂的逻辑实现起来就很不容易(比如自己拼接json字符串),所以智能合约只能完成基本的工作,遇到数据处理需建议将数据拿到后由js、java等等高级语言处理。
6.智能合约部署与调用
java有web3j插件库可以使用、JavaScript可以使用web3库,通过这些库文件完成与以太坊客户端交互。