数据可视化
准备工作
1.安装mysql
2.安装solidity编译器
操作步骤
1.开启mysql并创建一个和要导出的namespace名字相同的schema,以global为例:
mysql> create schema global;
2.编辑namespace.toml文件中配置项:
vi namespaces/global/config/namespace.toml
3.开启节点监听功能
[[service]]
service_name = "Radar"
这两行在配置文件中已经存在,使用之前要保证其不能处于注释状态
[radar-params]
viewable_db_type = "mysql"
mysql_connURL = "<username>:<password>@tcp(<address>)/%s?charset=utf8"
viewable_db_type
是数据库类型,暂时只支持mysql;mysql_connURL
是连接mysql的url。<address>
是mysql服务器地址,格式为ip:port或url:port,mysql的端口一般为3306。<username>
是登陆用户名,<password>
是登录密码。如连接到本机的root用户:
"root:root@tcp(127.0.0.1:3306)/%s?charset=utf8"
4.启动hyperchain,部署合约
5.调用SDK,通知radar监听合约
合约方法为
public ReceiptReturn listenContract (String sourceCode, String addr, int index)
三个参数分别代表合约源码,合约地址和希望监听合约的节点的id。下面是一个例子:
public void TestRadar() throws Exception {
String SourceCode = Utils.readFile("solidity.source/c1.sol");
int id = 1;
//deploy Contract
String contractAddress = deployContract("Bank", SourceCode);
Assert.assertEquals(contrtactAddress.length(), 42);
// notify radar to listen to contract
hyperchain.listenContract(SourceCode, contractAddress, id);
}
另外,也可以直接向想要监听并导出数据的节点发送jsonRPC命令来通知radar监听合约。命令的格式如下:
curl <节点ip:port> --data '{
"jsonrpc":"2.0",
"method":"radar_registerContract",
"params":[{"source":"<处理后的合约源码>",
"address":"<合约地址>"}],
"id":1
}'
jsonRPC命令中需要对源码字符串进行处理。处理规则如下:
1.去除所有注释(包含 “/**/”注释和“//“注释)。
2.去除所有换行符和制表符。
3.将所有引号转义(即,将所有"前面加上)。
- 发送交易,观察mysql中的schema是否存储了正确的合约数据
注意事项
因为mysql表名长度有限(64字符),故结构名、数组变量、字典变量名不宜过长
不要在合约中使用constant关键字
合约中不需要声明solidity版本号,不要出现pragma solidity ^0.4.24;。这一限制将在后续版本中解除。
使用solidity0.4.24及以前的版本,最新版本的支持后续会实现。如果通过brew安装过老版本的solidity,之后升级到了最新版,可以使用brew switch solidity 0.4.24命令恢复到0.4.24版本,其他版本相应修改后面的数字。
合约中不要使用复杂变量(数组字典元素、结构中的字段、msg.sender等)直接作为字典变量的key值,可以将其替换为简单的合约状态变量。例如:
contract test{
mapping (uint => uint) a;
uint [] b;
...
function t(){
a[b[0]] = 1; //b[0]是数组变量,需要一个简单状态变量作为中间变量
}
}
可改为
contract test{
mapping (uint => uint) a;
uint [] b;
uint c;
...
function t(){
c = b[0];
a[c] = 1;
}
}