从比特币看区块链与Golang实战
原创者:文思
一、区块链脉络
1、哈希
哈希以上特点决定了其对区块链支持的天然性。
2、加密
2.1对称加密:
明文—加密方法-->密文
密文—解密方法-->明文
以上密码本一旦暴露,就毫无安全加密可言。
2.2非对称加密:公钥加密、私钥解密
以上非对称加密可以解决加密问题,但无法解决传数据来源的验证问题,因为公钥公开发布,无法解决网络截取数据被劫持替换的问题。(截取网络数据,并伪造数据用公钥加密后传输)
现在就需要数字签名:
3、UTXO
Unspent Transaction Output,未花费的交易输出
比特币的概念没有余额的概念,只有输入与输出,在管理钱包时,记录的是交易记录,而不是余额(为了节省交易空间)
例如:
钱包内的UTXO已接收3笔比特币,1BTC、2BTC、5BTC,有了3笔未交易输出
然后消费4比特币,系统将5BTC的消费转账交易给收款方,系统找零1BTC,收款方收到4BTC
1是交易记录哈希值,2付款钱包地址,3花费,4收款钱包地址
仅保存交易记录,不保存余额,好处:
性能,比特币运行至今全部交易记录只有几百G
避免双重支付,任何一个钱包中的所有交易都写入了整个区块链网络,无法篡改。
4、收、付款方生成交易数据
付款方:
付款方发送上一次的交易数据与收款方公钥一起哈希作为付款方数据一起发送给收款方。
收款方:
5、交易打包成区块
如果有8笔交易,则两两做哈希:
最终的哈希值可以反映出所有的交易信息最终哈希值就叫默克尔树根。当你修改其中一笔交易时,整个块里所有的数据都需要去改,而且修改的操作必须全网中超过51%的节点认可才行,所以从很多方面保证了区块链中的数据不容篡改。
6、比特币网络节点之间的信任
很多笔交易打包成区块后与一个神秘数字放在一起做哈希,得到一个小于固定值的哈希值。
所谓的挖矿就是为了找到这个神秘数字。比特别的总量是2100万个。
7、为什么工作量证明可以信赖
矿工可以理解为具有运算能力的服务器,每台服务器进行神秘数字运算,算出神秘数字的服务器将信息发给周围服务器进行验证,验证通过后进行全网广播,全网广播后写入区款链。将来比特币挖完后,还有转账手续费可以赚取。
8、区块链结构
如上述所说,每两笔相互哈希最终形成默克尔树根,所有的信息都在整个网络。当你修改其中一笔交易时,整个块里所有的数据都需要去改,而且修改的操作必须全网中超过51%的节点认可才行,所以从很多方面保证了区块链中的数据不容篡改。
9、区块链展望
目前发展阶段:
类比的话相当于互联网的BBS时期。
关于区块链目前能够达成的共识:
1.去中心化不是万能的,但是在特定领域确。
2.实能够很好的解决中心化解决不了的问题。
3.所以区块链肯定不是一时热的昙花一现。
4.区块链必将成为未来互联网的基础设施。
区块链的应用领域:
金融、医疗、政府、内容分发版权确认
10、通证经济
https://www.sohu.com/a/226513640_100134484
1.Token不是代币,是通证。token可以理解为能流通的权益证明
2.通证需要具备三要素:权益、加密、流通
3.通证可代表一切权益证明
4.通证与区块链是两件不同的事情,但是彼此之间是最佳拍档
5.通证经济是下一代互联网的数字经济
6.通证、区块链、大数据结合是趋势
但是我们也要认识到通证经济并不能解决一切问题。通证只能保证你的权益不可更改,币不会滥发,参与者能够达成一定程度的共识,但是对很多问题是不能保证的。比如说募集资金使用的监管,项目进度的监管,团队会不会跑路,技术会不会过时等等问题还依然存在。也许是通证经济还只是个雏形,还需要不断的完善发展。
二、Golang实战
(一)认识Go语言
1、Go简介及应用场景
Go语言,我们可以简单的写成Golang,是Google公司创造和主推的。
Go可以做什么?区块链开发、Go服务端开发、Golang分布式/云计算
Go的优势:处理大并发、处理数据、计算能力
Go目前的应用领域:区块链应用、后端服务应用支撑(排序、推荐、搜索、按条件分流等)、云计算/云服务(盛大云计算:CND调度|分发系统|监控系统|短域名服务、京东消息推送云服务及京东分布式文件系统后端全部用go实现)
2、Golang的学习方法
高效;先建立整体框架,然后细节;先know how再know why;多琢磨别人怎么做;总结学习经验;后期注重技术基础及细节原理的认识。
Go语言的吉祥物,金花鼠
3、Go语言小故事
为何要创造Go语言?
发展历程:
2007年原型
2009年开源发布
2015年1.5版本中移除了最后的残余的C代码
2017年2月17日1.8版本
2017年8月24日1.9版本,1.9.2版本
2018年2月16日1.10版本
4、Go语言特点:
(1) Go=C+Python,兼顾运行速度与动态语言的快速开发。继承了C的理念,保留了C的编译执行方式,但弱化了指针。
(2) 引入包的概念,用于组织程序结构,Go语言的每一个文件都要属于一个包,而不能单独存在。
(3) 引入垃圾回收机制。内存自动回收,不需要开发人员管理
(4)天然并发(重要特点):从语言层面支持并发,实现简单;goroutine轻量级线程,可实现大并处理,高效利用多核;基于CPS并发模型实现。
(5) 吸收了管道通信机制,形成了Go语言特有的管道Channel,通过管道可以实现不同goroute之间的通信。
(6) 函数可以返回多个值,且go语句后面不需要写分号(编译器会自动加分号)
(7) 新的创新:比如切片slice、延时执行defer等。
5、Go语言的开发工具
1、visual studio code (VSCode)运行于主流操作系统智商,默认提供Go语言语法高亮,安装Go语言插件后可以智能提示、编译运行。
2、Sublime Text可免费试用默认也支持Go语法,但一定次数后提示是否购买。
3、Vim 是从vi发展出来的,代码补全、编译、错误跳转等方便编程的功能丰富。
4、Emacs 传说中的神器,不仅是一个编辑器,可称为一个集成运行环境。
5、Eclipse
6、LiteIDE 中国人开发专门Go语言开发
7、JetBrains公司的产品,付费,需要安装Go语言
建议学习时使用VSCode或vim。一定阶段后工作使用时用Eclipsse等自动化较强的开发工具。
(二)开发实战
创建一个文件夹gocode,类似java的workspace
package main//归属到main包下
import "fmt"//引入fmt包
func main(){
fmt.Println("hello")//输出hello
}
1、安装开发环境、sdk
https://www.golangtc.com/download下载sdk
然后解压即可:
配置环境变量:
GOROOT 指定sdk的安装路径
Path 添加sdk的/bin目录
GOPATH 工作目录,以后go项目存放的路径
例如:
2、快速入门
go程序的目录结构
d:/goproject
|--src
|--go code
|--project1(项目)
开始hello,world
通过go build命令进行编译源文件:build heelo.go
运行hello.exe文件即可:hello.ext
也可以用go run编译后直接执行:
大家注意,go和java在编译时不同的一点是,go可以指定编译后的文件名称。比如:
执行流程:
先编译再执行:类似java,编译后的exe相当于java的class
使用go run直接编译执行:底层也是先编译再执行。
先编译再执行的好处就是可以把exe拷贝到没有go的安装环境下执行
编译后的exe文件会将依赖的库也编译进来,所以exe会比go文件大很多。
注意事项:
Go应用程序的执行入口是main函数(和java一样)。
Go语言严格区分大小写。
Go方法由一条一条语句构成,语句后不需要加分号。
Go语言一条一条编译,不能把多条语句写在统一行。
Go语言定义的变量或者import引入的包引入后没有被使用,代码不能编译通过(和java不同)。
大括号成对出现,缺一不可。
3、转义字符及注释、规范的编码风格
\t 制表位
\n 换行符
\\ 一个\
\” 一个”
\r 一个回车
1) 行注释://
2)块注释:/**/
编码风格:
1)官方推荐用行注释来注释方法和语句。
2)正确的缩进和空白,可以使用键盘进行缩进,也能使用gofmt命令来进行格式化(gofmt –w main.go该指令将格式化后的内容重新写入到文件)。
3)运算符两边习惯性各加一个空格。比如:2 +3
4)一行尽量不要超过80个字符,如果超长建议使用换行符
5)左侧大括号要写在函数同一行,比如:
func main{
}
4、官方编程指南
点击tour选择中文,可以看中文版
待续......
有疑问加站长微信联系(非本文作者)