我们在我们的私有链环境中部署我们第一个简单的智能合约。当然智能合约都是通过solidity语言来编写的。
1.智能合约代码
本文的智能合约采用以太坊官方的示例合约,功能就是在区块链上存储一个数字,并能够读取出来。代码如下:
pragma solidity ^0.4.18;
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public constant returns (uint) {
return storedData;
}
}
该合约set函数存储一个数字在x变量中,get函数从x变量中读取这个数字出来。
首行只是简单的告诉编译器使用 0.4.18 版本或者更新的版本(不包括 0.5.0 ),不影响功能。这么做可以保证合约代码在新的编译环境中不会突然出现不同的行为而导致 bug。通常关键词 pragma 在这里的作用就是告诉编译器要如何处理源代码;
第二行就是创建一个名为SimpleStorage的智能合约;
uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为 uint (256bits无符号整数);
2.部署智能合约
2.1启动私有链
第一步就是要通过geth来启动私有网络。我们将105.30和105.71这两个节点都启动起来。
2.2开启挖矿
所有交易的确认都是要通过挖矿进行确认的,所以需要开启挖矿。
miner.start(1)
2.3打开ethereum-wallet钱包
我们将A和B这两个节点的ethereum-wallet打开,并确保连接到私有网络。
2.4在节点A上部署智能合约
我们通过ethereum-wallet图形化方式来部署上面的智能合约,当然也可以使用geth命令行方式部署,图形化方式简单,推荐。
点“CONTRACTS”,进入智能合约管理界面,

点击“DEPLOY NEW CONTRACT”,开始部署智能合约,选择部署智能合约的账号,并输入智能合约的代码后,如下图

最后,我们点击DEPLOY按钮,系统会提示输入账号密码,因为部署智能合约是需要费用的。最后,点击send transaction,通过挖矿完成确认便可。
接下来我们查看一下,我们刚才部署的智能合约simple storage
在ethereum wallet界面,选择contracts

通过选择智能合约simple storage,我们可以查看详细情形。我们测试一下我们刚才写的程序,在set出输入1985,通过点击execute后,在get处就会出现1985.

2.5在其他节点B上运行该智能合约
经过上述的步骤,智能合约(simple storage)只能被节点A看到,别的节点是无法看到和运行的,如果其他节点(如B)要运行节点A上部署好的智能合约,具体操作如下 :
(1)获取节点A上智能合约(simple storage)的地址及JSON接口
1)我们在节点A上智能合约(simple storage)上通过copy address方式复制地址;
2)通过show interface,显示json信息,进行复制。
(2)在B上添加上述合约地址和JSON接口
在节点B打开Ethereum-Wallet,打开“CONTRACTS”界面点击“WATCH CONTRACTS”添加一个智能合约。

第一行:添加节点A上智能合约(simple storage)的地址
第二行:自定义合约名称
第三行:添加节点A上智能合约(simple storage)的JSON接口信息
最后,点OK后,就可以看到这个智能合约并运行了。
3.概述上述智能合约过程
本节介绍的智能合约的部署虽然是在图形化界面编译和执行,但其实最主要的是依赖于后台运行Geth的节点,此时Geth提供了一个RPC的接口向图形化界面的钱包提供区块链的信息。Geth在8545端口提供了JSON RPC API ,数据传输采用JSON格式,可以执行Web3库的各种命令,比如向前端,比如mist等图形化客户端提供区块链的信息,默认访问地址为http://localhost:8545。
我们部署一个智能合约时,首先Ethereum-Wallet调用SOLC智能合约编译器将代码编译成EVM字节码,然后将EVM字节码通过Geth的RPC接口发送到以太坊网络,经过全网验证后,同时写入到每个Geth管理的区块链中.
数据流
首先代码先经过SOLC编译变为了二进制码,然后通过一笔交易来创建智能合约,该笔交易包含了创建者账号、智能合约内容、智能合约的地址这几个关键信息,其中智能合约地址的生成是由创建者的账号和发送的交易数作为随机数(nonce)输入,通过Kecca-256加密算法重新创建一个地址作为账号。
网友评论