基于区块链的智能物联网系统设计
2022-07-05苏晨陈梅赵静雅高震宇
苏晨 陈梅 赵静雅 高震宇
摘要:在大规模物联网设备接入的环境下,当前的C/S物联网架构存在可靠性、安全性、隐私性等方面的问题。区块链技术作为一种新兴的分布式账本技术,具有安全、可靠、匿名等特点,适用于物联网。文章提出了一种基于区块链的物联网系统,该系统选择Ethereum作为区块链平台,通过智能合约配置和控制物联网设备,并使用RSA公钥密码系统管理密钥。
关键词:区块链;智能物联网;智能合约;网络信息安全
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2022)14-0028-03
1引言
随着信息社会的发展,物联网(也称为“互联设备集合网络”)也在快速发展,物联网设备数据在未来几年内也将出现爆发式增长,这些数据增长大多来自消费者设备,意味着物联网数据需要更高的安全性及可靠性为其保驾护航,当前的物联网最突出的几个问题就是过于中心化及不能自制,使各个物联网上的设备不能充分发挥其自主能动性,还有一个突出的问题是安全性,如果到了智能互联的时代出现安全问题,将会造成巨大的灾难。而区块链的高安全性、高可靠性、匿名性正适合物联网将来成长的需求。区块链的新兴观点逐渐进入人们的视线。顾名思义,区块链就是一个智能的点对点网络,用于在分布式数据库中识别、分播和记录信息。
区块链的主要应用是比特币。随着比特币的盛行,许多其他类似数字货币也随之出现,然而这些货币也是建立在区块链技术之上的。此刻已不只是数字钱币范畴独有区块链了,很多其他的范畴也在引入区块链。虽然比特币技术十分成功,但它其中的局限性也十分明显,比如区块产生时间大概为10分钟,这将会极大限制单位时间内交易完成数量。也就是说,当要追踪需要验证的未生成交易,并且提供脚本信息时,这不能够使用循环,将会使未生成交易的生成时间变长。因此12秒的生成时间对于以太坊开发者运行智能合约是非常必要的。换言之,开发者可以在一个以太坊框架之上对区块链应用进行开发,开发者和使用者可以假想它没有许可证不能被修改,甚至可以说整个交易在以太坊平台上都是透明的,本文可以认为以太坊是一个巨大的分享式计算机系统。
同时,随着物联网技术的飞速发展,数量庞大、种类繁多、分布广泛的物联网设备不断连接到物联网络。目前大规模、多种类、广分布的物联网设备的同步和更新对现有的基于服务器-物联网的物联网设备,将提出更高的性能方面要求。同时,如果物联网中心服务器受到攻击,那么所有依赖于其服务的物联网设备也将会受到安全威胁。所以,基于服务器-客户端的物联网系统已不再能满足日益壮大的物联网网络。本文提出了一种基于区块链的智能物联网系统,构建了一个安全可信的分布式物联网网络。
区块链作为比特币的核心技术也引起了人们的广泛关注,虽然区块链技术起源于比特币,但其应用场景并不局限于区块链。还很多场景应用,比如金融领域、物联网领域、社会科学领域等。以太坊平台的出现使区块链技术得到空前发展,作为区块链技术2.0的代表,以太坊支持用户拓展开发其他应用。所以把区块链的相关技术引用到物联网体系中去,把RSA公钥系统引进密码系统,公钥存在于以太坊网上,私钥存在于各个设备之中。通过智能合约,可以重设当前设备的許多参数,并将修改记录保存在以太坊链上,以便后续查询。为了证明这一设想的可行性,构建出一些账户节点,每一个账户代表一个设备。依此,希望后续可以搭建一个完整的智能物联网系统,连接更多可用设备。
2系统搭建
本设计要完成的目标是在Linux平台搭建私有链,创建私有网络,建立集点结群,安装truffle框架,安装remix本地编译器,利用本地编译器编译调试智能合约,安装geth客户端,利用geth客户端完成简单合约的编译、部署、调用,再使用Etherum-wallet客户端完成整个合约的编译、部署、调用,并得出仿真结果。
2.1 Geth客户端的原理及特性
Geth是以太坊的官方客户端,它是Go-Ethereum开源项目的简称,是一个简略的命令行工具,在此提供了许多的选项和命令。它主要是使用Go语言进行编写的,是目前用户数最多、使用最广泛的客户端。应用Geth,需先启动以太坊节点,建立新用户、新账户,在主账户下可以建立副账户、建立节点集群、成功搭建私有链网络,并启动私有链网络进行挖矿,获得以太币。
2.2 节点集群的搭建及网络测试
如上所述,现已知的搭建以太坊私有链网络的方法目前主要是运用Geth客户端进行搭建,在安装Geth客户端前需要安装Go环境,安装Ethereum,安装Solc编译器,安装命令行如下所示:
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository –y ppa:ethereum/ethereum
sudo add-apt-repository –y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
执行完以上命令后,可以启动以太坊客户端,此中主要有geth、evm、bootnode、disasm、ethtest、rlpdump,输入geth,则以太坊就可以启动了。
但在搭建以太坊私链节点前,必须先建立创世区块,之所以要先建立创世区块,是因为只要在同一个网络内,创世区块文件一定是相同的,且创世区块的json文件,文件内容如图1所示,具体参数的意义可见表1所示。
接下来,用geth命令创建创世区块,命令行输入如下:253BDD9C-134C-42E8-A3C6-BDB324C66E0A
由图2可以看出创世区块的文件内容已被写入data0文件夹中,数据存储路径为/usr/local/privatechain/data0/geth/chaindata。
由图3和表2可知私链数据存在data0中,网络监听端口为61910(默认为30303),HTTP-RPC服务器监听端口为8200(默认为8545),设置所需调用HTTP-RPC接口,在默认基础上加了db,其次还设置了当前区块链的网络ID为1108。
由启动页的最后一行可知geth包括了一些方法,此中admin主要包括与管理节点有关的方法,eth包括和操作区块链有关方法,miner包括挖矿启动&终止方法,net包括检查P2P网络状况方法,personal包括管理账户方法,txpool包括检查交易内存池的方法,web3包括以上且还包含单位换算方法。
命令eth.accounts可以检查当前存在账户及账户地址,personal.newAccount()可新增账户,增加账户的时可设置账户密码,eth.getBalance(eth.accounts[0])可查看eth.accounts[0]内的账户余额,为之后查看账户及余额方便,还可自己添加查看方法,这里添加了function checkAllBalances(),具体函数如图4,还可通过命令eth.coinbase查看主账户,也可通过miner.setEtherbase(eth.accounts[1])重新设置主账户为eth.accounts[1],通过命令web3.fromWei(eth.getBalance(eth.accounts[0]),ether)可将账户余额的单位换成ether,通过命令eth.blockNumber可获取当前区块数。
实施节点内转账需要提前解锁账户,解锁账户后,可通过命令eth.sendTransaction({from: eth.accounts[0],to: eth.accounts[2],value: amount}),其中 amount= web3. toWei(5,ether),也就是转账5ether,通过txpool. status可以查看当前待处理交易,由图5可知当前可验证交易为一条,需要主账户启动挖矿使得交易生效,挖矿命令为miner. start(1),若想要结束使用miner. stop(),当前需要验证交易,故设置为挖到一个区块则停止,命令为:miner.start(1); admin.sleepBlocks(1); miner.stop(),其结果如图5所示,通过查看eth. accounts[2]的余额可知交易生效,您还可以通过查看其事务哈希值获取事务详细信息,命令为:eth.getTransaction(交易区块哈希),也可通过交易区块号查看交易详情,命令为:eth.getBlock(区块号)。
网络监听端口需要改变,HTTP-RPC服务器监听端口需要改变,网络ID不能变(如果想连接节点一)。
可通过admin.addPeer(节点哈希)在节点一的console命令下添加节点,节点哈希可从节点二中获得,也可在节点二下输入命令admin.node.info获得,添加节点成功后可通过admin.peers查看节点连接具体信息。同时还可通过输入net.peerCount得到节点数。以同样方法添加节点三,如图6。再次输入admin.peers可看到三节点连接信息。
3智能合约在链上的编译、部署、调用
3.1智能合约的编译
Geth中也可完成智能合约的编译,但因Geth是命令行编译,许多操作包括边编译、边改错的操作无法同时进行,非常不方便,因此以太坊的官网推荐使用remix编译器,当然也可以选择其他编译器,这里主要推荐官方编译器,为方便在链上直接进行编译,本文下载安装了本地编译器,优点是本地编译器在网络不稳定情况下,也不会出现大问题,且许多存储修改结果都可在本地找到。命令行打开本地remix,右选compile,勾选auto在编写的时也会自动编译,编译结果在右下显示,错误和警示都有。environment可以选择web3,输入http://localost:8200可以連接本地私有链,这里的RPC接口与之前设置私链节点的接口一样,也可连接模拟私链环境进行测试,接口为8545,因此可以输入http://localhost:8545。这里的模拟私网有账号10个,还有相应的密钥,可以部署相应的合约在其进行测试。
3.2智能合约的部署
当智能合约编译不出错的情况下,还需将智能合约部署在所搭建的私有链上,在这里选择官方推荐的ethereum-wallet,在使用ethereum-wallet时,需要配置附属环境,打开Meteor,使App运行在3000接口上。通过命令行打开Ethereum-wallet,在etherum-wallet上的所有操作信息都会显示在下面,可按出错提示寻找解决办法。
编译无错的合约放在左下框中,选择部署主账户,保证该账户中有足够的以太币部署合约(因部署合约会消耗以太币),接下来在右下选择部署合约的主函数,填入需预设的构造参数,接下来点击部署,若要使得部署合约生效,需要再次进行挖矿,合约部署成功后可进行合约调用,结果如图7所示。
合约部署成功后,可在首页查看部署消息,对合约的操作记录都会存在链上,部署合约记录。同时点击首页的contract,可看到曾部署过的所有合约,同样也可查看合约Token。
3.3智能合约的调用
在成功部署合约后,开始进行合约的调用,本合约模拟家居用电情况监测,每一个账户代表一件家电,监测家电使用情况,家电把用电量通过P2P的形式传到以太坊网中,合约收到所有家电的用电量情况。253BDD9C-134C-42E8-A3C6-BDB324C66E0A
若要查看各个账户发送情况,可看到各账户左上角有合约调用记录。若要细看,只需点开各个账户查看。
打开合约调用界面,在没收到两账户的电量使用情况下,没调用Check Target Reached方法前,目标完成情况是NO。
调用Check Target Reached方法,结束调用后,查看目标完成情况,变为YES,此时只需把这一结果输出到电器中做触发电平,启动节能模式,即可使电器转换为节能模式。
4结语
本文主要介绍了如何搭建以太坊私链网以及搭建原理,并在此基础上在私链上部署所需的智能合约。除此之外,还讲述了智能合约怎样编译,智能合约怎样部署在以太网私链上,在智能合约成功部署后,讲解了智能合约的调用,成功完成了实验的仿真,实现了对家电的用电量的监测,当其用电量达到一定值时,各电器转而变成节能模式。
参考文献:
[1] Xu L D,He W,Li S C.Internet of Things in industries:a survey[J].IEEE Transactions on Industrial Informatics,2014,10(4):2233-2243.
[2] Al-Fuqaha A,Guizani M,Mohammadi M,et al.Internet of Things:a survey on enabling technologies,protocols,and applications[J].IEEE Communications Surveys & Tutorials,2015,17(4):2347-2376.
[3] Singh J,Pasquier T,Bacon J,et al.Twenty security considerations for cloud-supported Internet of Things[J].IEEE Internet of Things Journal,2016,3(3):269-284.
[4] Ferrer E C.The Blockchain:a New Framework for Robotic Swarm Systems[EB/OL].(2016-08-02).[2021-11-20].https://xueshu.baidu.com/usercenter/paper/show?paperid=1w0c0rt093 690840t72n0ej0ex033896.
[5] Sharples M,Domingue J.The blockchain and kudos:a distributed system for educational record,reputation and reward[C]//Adaptive and Adaptable Learning,2016.
收稿日期:2021-12-30
基金項目:北京电子科技职业学院科技一般项目(基金号:2021Z031-KXY)
作者简介:苏晨(1973—),女,山东莱芜人,讲师,硕士,主要研究方向为网络技术、计算机应用、视频图像处理等。253BDD9C-134C-42E8-A3C6-BDB324C66E0A