APP下载

基于Go语言的区块链模型设计与实现*

2021-04-22刘敏娜尹成姚波

数字技术与应用 2021年2期
关键词:哈希工作量校验

刘敏娜 尹成 姚波

(1.咸阳师范学院,陕西咸阳 712000;2.微软-清华大学联合实验室,北京 100000)

0 引言

区块链是由中本聪提出的比特币的底层技术。区块链技术具有去中心化的组织方式、基于共识的数据共识机制、建立在隐私保护基础上的公开数据读取方式等特点[1]。区块链通过交易数据哈希加密,可以保证数据安全,解决数据篡改验证的问题;通过时间戳机制记录数据交易的完整过程,使得交易数据全程可追溯;借助POW工作量证明算法解决不同节点记账权的问题。总之,使用区块链技术可以解决Web应用程序中心化平台的安全隐患。

目前区块链技术研究主要包括通用协议研究(智能合约,隐私保护等协议)、数据层研究(非对称加密,分布式数据库等)、网络层研究和应用研究。应用研究包括区块链技术与金融、教育、工业等领域整合应用[2]。本文主要研究使用Go语言构建区块链模型,目的是通过模型研究为下一步将区块链技术整合在基于B/S架构的Web程序(即传统Web程序+区块链技术应用)打下基础。

1 区块链技术和Go语言

1.1 区块链技术

区块链技术本质是一个去中心的、通过分布式节点进行数据存储、验证、传递和交流的网络技术方案[3]。区块链技术最早是应用在比特币系统中,作为比特币的底层存储结构。区块链的基础技术有哈希计算、数字签名、P2P网络、共识算法和智能合约。一个成熟的区块链具有透明可信、防篡改、隐私安全保障和系统高可靠等特性。区块链从最初的金融领域的应用,到现在在供应链、政务、数字版权和医疗等领域都有广泛的应用。

1.2 区块链开发语言Go语言

Go语言是Google公司开发的一种开源通用编程语言,是一种用于搭载Web服务器,存储集群的系统编程语言[4]。具有编译速度快,执行效率高、网络编程友好、高并发、跨平台等特性,因此使用Go语言进行区块链开发具有天然优势。因此,本文使用Go语言构建区块链模型。

2 区块链模型构建的意义

区块链最早应用在以比特币为首的数字货币中,区块链技术的出现对金融领域产生颠覆性的影响。随着智能合约的出现,区块链扩展到了金融领域之外的司法、医疗、教育、物流等领域。区块链与传统行业的融合目前采用的是以传统行业为主,以微创新的方式在传统行业内部以可控的方式应用区块链技术[5]。本文探讨的是网络环境下区块链模型的构建,模型的搭建对于理解区块链技术原理有重大的意义,同时为下一步将区块链技术融合在现有的软件系统提供重要的指导思想。

3 区块链模型设计

3.1 方案设计

基于Go语言的区块链模型整体架构如图1所示。模型中包括POW工作量证明、交易数据生成、区块生成、区块校验和区块上链五个模块。区块链操作过程为:用户在网络中通过post请求发起新的交易,节点接收到交易数据之后存储在本地交易池中,网络中的所有节点竞争记账权,通过POW工作量证明算法来保证只有最早解出题的节点可以将交易池中的数据写入区块。拥有写入数据权力的节点将新生成的区块发送给网络其它节点,当网络中51%的节点验证通过,此时网络中节点将新区块写入本地区块链中。

图1 区块链模型结构图Fig.1 Blockchain model structure diagram

图2 网络上的区块链信息Fig.2 Blockchain information on the network

方案的设计流程为:创建创世区块,并将创世区块追加到切片中,加载配置文件,并解析配置文件中的端口号,开启监听器,等待用户请求,当发送get请求时,将网络中区块链节点显示到客户端。发送post请求时,接收用户输入的交易信息,将交易信息和当前时间等信息打包到区块中,并发送给其它节点校验数据。

3.2 共识机制-POW工作量证明

共识机制用来验证交易记录的有效性,同时通过共识机制来竞争记账权。区块链上的共识机制包括工作量证明POW,权益证明POS,股份授权证明DPOS[6]。因为POW工作量证明完全去中心化,且节点可以自由进出,因此本方案采用POW算法作为共识机制。

POW中所有节点竞争记账权,只有解出难题的节点才有记账权利。每一次的记账都有一个难度系数Diff,这个难度系数控制链增长的速度。模型中设置难度系数为4,当前区块的前一区块哈希值PreHash、当前区块的难度系数Diff、当前区块的交易数据BPM、当前区块的高度Index、当前区块的随机数Nonce字符串这五个变量连接之后计算哈希值,如果哈希值满足难度系数要求的前4位是全零,这时节点解出难题,将难度系数记录在区块中。由其它节点校验解题结果,校验通过将区块写入区块链;如果哈希值不满足要求,则将Nonce值加1,再次计算哈希值结果是否满足难度要求。

3.3 区块存储结构

为了将研究重点聚焦在区块的生成、上链等操作。模型中简化了区块链的结构,去掉了默克尔树根。区块中包括PreHash前一个区块的哈希值、Hash Code当前区块的哈希值、TimeStamp时间戳、Diff难度系数、BPM交易信息、Index区块高度和Nonce随机值。区块和上一个区块之间通过PreHash值构成了连接关系,从而组成了区块链。

区块结构体定义如下:

type Block struct {

PreHash string

HashCode string

TimeStamp string

Diff int

BPM int

Index int

Nonce int

}

3.4 区块哈希校验

区块校验包括:()1判断新生成的区块中的index是否比已有区块链中最后一个区块的index大1;(2)新区块的PreHash是否等于上一个区块的哈希值;(3)根据新区块的信息再次计算哈希值,判断是否和newBlock中的Hash Code相等。

4 区块链模型仿真及分析

Windows7环境中,使用Go语言编写仿真实验程序。实验中因为涉及到发送get和post请求,需要传递一定的参数,使用Postman进行请求测试。实验分别模拟get请求查看网络中区块链、post请求创建新交易,通过这两种请求可以测试新交易创建、交易保存至区块、区块校验、区块上链等操作。

4.1 客户端发出post请求创建新交易测试

在Postman中,设置请求方式为POST,输入url:http://localhost:9000,在body表选项卡中输入参数{“BMP”:1000},这个参数表示交易金额是1000,点击发送之后,在response区域显示经过POW工作量计算生成的区块信息,前面已经生成了两个区块,因此当前区块高度为3。经过测试,可以生成新交易,并通过工作量计算,可以将交易写入区块。

4.2 客户端发送get请求测试

启动Postman应用程序,下拉列表中选择GET请求方式,输入代表本地测试的localhost,端口号是9000,点击send按钮发送请求。在response区域显示网络上的区块链信息,链上有3个区块,如图2所示。高度值为1的区块是创世块,第2个区块的哈希值为“00005105373dcbdfcd ba3b13f5194bf1cbef194ac3e2f441e69b2339d85118e8”,第3个区块的哈希值为“0000f5d782bb7b4d61002802769 f8a1b91b6c0267e4bc4752d979a01223728e1”,哈希值满足难度系数要求的前缀“0000”。新的区块校验成功,区块被写入区块链。

5 结论

本文设计了基于Go语言的区块链模型。模型中模拟新交易数据生成、新区块生成、区块上链等过程。模型的搭建对于理解区块链技术原理有重大的意义,同时为区块链技术整合在基于B/S架构的Web程序打下基础,为在传统行业融合区块链技术提供重要的指导思想。

猜你喜欢

哈希工作量校验
应用地表覆盖数据估算LiDAR内业工作量的方法研究
炉温均匀性校验在铸锻企业的应用
一个兼顾教学科研的高校教师绩效考核模型及其应用
思科发布云计算市场发展报告
基于维度分解的哈希多维快速流分类算法
大型电动机高阻抗差动保护稳定校验研究
基于加窗插值FFT的PMU校验方法
锅炉安全阀在线校验不确定度评定
网上互动教学工作量管理的困境及对策
基于同态哈希函数的云数据完整性验证算法