互联网的出现以及各种互联网应用的普及使得人们的生活水平得到了极大提升。随着互联网技术的不断发展,人们开始对互联网的可靠性和成本提出更高的要求。
比特币的诞生使得区块链技术进入了人们的视野。通过比特币流通的透明化和隐私性,人们开始意识到区块链可以构造一个更加可靠的互联网系统。
在区块链体系中,打破了传统模式中以第三方为中心的信任模式,使得交易信任和过程依托机器和程序,具有弱中心化的特性。这样的特性使得区块链技术可以简化流程、有效降低成本,可以用于更多的社会领域中,这也使得区块链拥有了更大的现实意义。
越来越多的国家和行业认识到区块链的巨大前景,区块链的应用价值得到了全球的广泛关注。
简单来说,区块链技术就是一套由多方参与的、可靠的分布式数据存储系统,以共识机制、密码学原理和分布式数据存储为核心。具有记录行为多方参与,数据存储多方参与、共同维护以及通过链式存储数据与合约,只能读取和写入,不能篡改的特点。
2008年中本聪发表论文《比特币:一种点对点的电的现金系统》,该论文催生了比特币,同时也使得区块链技术开始得到了发展。2009年1月3日,区块链的第一个区块诞生。
2012年——2015年,区块链随着比特币进入到公众视野,并开始扩散到金融领域。随着区块链底层技术的不断创新,区块链技术的应用得到了进一步扩大。
目前,区块链技术在金融领域、物联网领域、公共服务领域、公益慈善领域和供应链领域都取得了一定的应用。随着区块链的应用价值在全球范围内引发了越来越多的关注,世界各国也纷纷从国家层面思考区块链的发展道路。
不难看出,区块链技术对现有的经济社会产生了巨大的影响。在未来,将会出现越来越多的成熟的应用。同时,区块链技术的发展也将会对人类的互联网活动产生巨大影响。
根据区块链体系弱中心化的特性,未来区块链系统架构将是构建多中心化的体系。随着区块链应用的不断扩大,未来区块链技术也将应用到更多的行业中。此外,区块链技术具有通过链式存储数据与合约,只能读取和写入,不能篡改的特点,这也给智能合约的社会化带来了无限可能。
总的来说,未来区块链技术的人发展还有十分广阔的空间,区块链技术也将会在越来越多的领域得到发展。
本食品安全系统由四个模块组成:部署了以太坊区块链服务的Azure服务器、FoodSafe源程序、MetaMask插件以及用于交互的Chrome浏览器。其具体结构如下所示:
该系统从FoodSafe中的js脚本启动,在安装有MetaMask插件的Chrome浏览器中与Azure服务器通过RPC进行交互。FoodSafe模块中包含了编写好的智能合约,MetaMask插件用来管理区块链中的账户并与Azure进行通信。
为了以尽可能接近实际应用中的情况,我们希望区块链网络运行在云平台上。这里选择的是微软提供的Azure云服务平台。目前Azure为每个新注册的用户提供200美元的免费使用额度(需要绑定信用卡),只需注册一个用户就可以免费配置了。
我们需要在微软提供的Azure云服务平台上部署一个Ethereum Proof-of-Work Consortium解决方案。这个服务可以在Azure的应用商店直接找到。你只需要在搜索框中输入Ethereum Proof-of-Work Consortium就能进行安装。
Ethereum Proof-of-Work Consortium通过一组解决方案与模板在Microsoft Azure上实现区块链,使用入门的Azure配置以及少量区块链知识就能在云平台上部署并配置自己的区块链网络。所有的基础架构都会被自动完成,你可以专注构建自己的使用场景和应用程序。
部署过程一共7步,需要输入很多名称与密码,配置保持默认即可,记得第五步的Monitoring选disabled:
部署后需要等待一定的时间,然后在左侧资源组中找到刚刚你定义的资源组,点击进入后在弹出的页面中选择设置-部署-microsoft-azure-blockchain.azure-blockchain…,再点击输出,得到如下界面:
复制RPC地址,这在MetaMask插件中会用到。MetaMask插件的安装和使用这里不再赘述,可以参考这个链接,记得在MetaMask的setting中添加我们的RPC地址,然后network中选择这个地址。
下图展示的是以太坊网络中一次状态转化的过程:原状态中第一个账户以智能合约的形式向第二个账户发送一些数据,其付出的代价是10枚ETH(以太币),完成转换后的新状态中相应的账户数据得到了更新。
实际使用中,MetaMask插件会提供下图所示的交互界面,并管理区块链网络中的不同账户。每一次转化的过程都会以如下形式告知用户相关信息:
其中Gas代表的只是本次传输所需要的“资源”或是“成本”,不用深究其具体含义。当用户点击了SUBMIT按钮后,区块链网络中的Account1就会向Account2转帐129ETH。
值得注意的是,区块链网络中的任何操作都是需要成本的,即使在我们试图构建的食品安全系统中,每次智能合约的生成或是位置信息的添加都需要经历上述“转账”过程,换言之——任何想要在区块链中增加信息的行为都需要支付“代价”。
构建这个食品安全系统除了需要云平台的支持外,也需要在本地搭建一系列运行环境,具体有:
在完成了环境的配置过后,就可以开始编写智能合约了。
智能合约与普通的代码并没有什么区别,只是其运行在以太坊这样一个分布式区块链平台上。这个运行的平台赋予了这些代码不可变,确定性,分布式和可自校验状态等特点———这也正是智能合约的特性。在这个区块链网络上添加的任何信息都将是不可变的。
上图很直观的展示了智能合约的应用:在一个房屋出售案例中,买房与卖方通过智能合约的方式来完成交易。房屋的产权由数字化产权系统进行管理,交易的资金以数字货币的形式提供,买卖双方只需提供资金和房屋产权,这个智能合约就能自动完成所有的工作。买卖双方的一切交易都将按照合约内容强制进行,无法伪造,也无法更改,这能在很大程度上减少交易过程中的纠纷。
在以太坊区块链中,每个合约都有一个唯一的地址来标识它自己(由创建者的哈希地址和曾经发送过的交易的数量推算出来)。客户端可以与这个地址进行交互,可以发送ether,调用函数,查询当前的状态等。
回到食品安全系统,我们希望食品在生厂商、供应商以及商店之间流动时的,能够保留其所有的位置信息以及时间信息,这样一来,食品从生产到销售的每一个环节都将是公开且不可伪造的。考虑到实际情况中生产商、供应商以及商店都希望向竞争对手们保留一些商业机密,我们加入了secret字符串,这一字符串会在js文件中使用AES加密。
如上图所示,食品从生产、供应到销售过程中所有的位置信息都将存储在搭建好的区块链网络中,本地可以在区块链中添加或是获取信息,但不能进行更改。当食品最终到达顾客手中时,顾客可以通过公开提供的合约地址访问区块链网络中的数据,追溯食品整个生命周期的公开信息。商家们可以通过密钥保管一些希望向竞争对手保留的秘密,并根据需求将密钥交给自己的合作伙伴或者监管部门。
以太坊所需要的合约文件是以.sol结尾的(使用一种名为Solidity的智能合约语言),这就需要在VSCode中创建一个FoodSafe.sol文件,然后在文件中建立一个FoodSafe合约,添加如下所示的Location结构,用来存储相应的信息。其中Name代表位置的名称,LocationId代表位置的ID,PreviousLocationId代表上一个位置的ID,Timestamp表示时间戳,Secret表示机密信息。
struct Location{
string Name;
uint LocationId;
uint PreviousLocationId;
uint Timestamp;
string Secret;
}
除此之外,还要在合约中增加几个函数,分别用来添加新的位置,获取交易总数以及获取当前位置信息,在这里不给出具体代码,请参考源码。
在编写好智能合约后,将其在在线网站中进行在线编译并得到所需要的web3deploy代码,最后将其复制到要运行的js脚本之中。这么做的原因是web3.eth已经不再支持对.sol文件的直接编译,只能将编译好的智能合约提前写入js文件中。
在搭建好区块链网络并编写好需要的智能合约后,便可以真正开始解决实际的食品安全问题。我们需要构建一个本地系统来使用区块链网络。该系统以一个简单的网页作为食品安全系统与用户进行交互的主体,并以Web3.js脚本作为交互的主体,其具体结构如下图所示:
APP是该系统呈现给用户的交互界面,这里选择一个简单的测试网页作为交互界面。蓝色虚线框内的就是部署在Azure上的以太坊区块链服务,它以JSON-RPC的方式与客户端进行交互。Web3.js是整个系统的驱动主体,它主要有以下几个任务:
该脚本以如下方式初始化编译好的合约:
foodSafeContract = web3.eth.contract(......);
并以以下方式生成一个合约的新实例
var foodsafe = foodSafeContract.new(
...
);
FoodSafe合约中机密信息locationSecret的加密可以通过如下语句进行,其中passPhrase是密码:
var encryptedSecret = CryptoJS.AES.encrypt(locationSecret,passPhrase).toString();
该项目完整的源码请点击这里获取。
在配置好相应的环境后,打开终端,进入FoodSafe目录,输入如下命令:
npm run dev
然后打开Chrome浏览器,输入地址localhost:8080,如下所示:
则系统启动成功!
点击“添加新食品”按钮,在MetaMask弹出的界面中点击SUBMIT按钮,静待区块链服务器响应,直到合约地址一栏出现了自动填充的地址,如下图所示:
然后填写我们想要生成的位置信息,并点击“添加食品位置信息”按钮,同样在弹出的界面中点击SUBMIT按钮,静待区块链服务响应。
Chrome消息提示Confirmed过后,就代表该位置信息已添加到区块链网络,我们复制合约地址到剪切板,刷新该网页,将地址粘贴到第一行,然后点击“获取当前食品所有信息”按钮,得到如下结果:
可以发现之前存在于区块链中的相关信息能通过合约地址来访问,但之前的保密信息呢?这需要输入密码才能看到,我们在密码栏输入岗山超市对应的密码,再次点击“获取当前食品所有信息”按钮,就能看到岗山超市关于该食品的保密信息了:
输入该食品生产销售流程中不同位置对应的密码,就能获取相对应的保密信息,具体可以参考演示视频。
如果想要追踪食物生产交易流程中的更多信息,只需要添加相应的位置信息即可,因为所有的位置信息都将保存在区块链网络中,不可伪造,不可删除,且任何人都能通过合约地址访问位置信息(保密信息需要相应密码)。