重要!
做数据分离推荐使用2018年后的的Geth版本,即v1.8以上。在genesis.json创世文件的配置config里需添加拜占庭Block,如下:
"config": {
"chainId": 1,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0
}
"byzantiumBlock": 0 为必添加项!
以太坊智能合约的设计是部署后不允许修改的,所以智能合约修改后重新部署数据便会丢失,但是难免有业务需求的变更,这时候便出现了可升级式智能合约,其原理是将数据合约和业务合约进行分离,用业务合约去调用数据合约,这样当需求变更时,只需要重新部署业务合约即可,而在数据合约里存储的数据则不会丢失。目前智能合约的数据和业务分离有两种方式,第一种是通过合约的地址进行调用,另一种是通过一个Proxy代理合约进行代理调用。地址调用十分简单,代理调用相比稍复杂一些,国外使用代理调用稍多一些。个人没有对比过两种方式的差异,大家可以自己选择,两种方式都可以实现数据分离。
1 地址调用方式
数据合约如下
pragma solidity ^0.4.24;
contract MyCoinData {
address private master;
mapping (address=>uint256) private balances;
constructor () public {
master = msg.sender;
balances[master] = 1000;
}
function getBalance(address who) view public returns (uint256 value) {
return balances[who];
}
function setBa