智能合约运用
2018-07-09 本文已影响21人
最近不在
比如我们要记录下用户最新签到的时间, 我们可以这么来写.
contract Hello {
mapping (address => uint256) signedMap;
//返回当前时间
function nowInSeconds() internal view returns (uint256) {
return now;
}
//签到
function signed() public {
signedMap[msg.sender] = nowInSeconds();
}
//获取上次签到时间
function getLastSignedTime() public view returns (uint256) {
return signedMap[msg.sender];
}
}
如果增加需求, 允许用户删除签到数据, 我们增加如下代码.
function unsigned() public {
delete signedMap[msg.sender];
}
上面的代码, 是完全公正的, 只能用户自己添加, 删除, 查看
如果改一下需求, 允许管理员读取, 删除数据. 这个时候我们需要对执行者进行判断(msg.sender
), 以及增加管理员相关的代码.
contract Hello {
address admin;
mapping (address => uint256) signedMap;
modifier onlyAdmin() {
require(msg.sender == admin);
_;
}
constructor() public {
admin = msg.sender;
}
function getVal() public view returns (uint256) {
return msg.value;
}
//返回当前时间
function nowInSeconds() internal view returns (uint256) {
return now;
}
//签到
function signed() public {
signedMap[msg.sender] = nowInSeconds();
}
//获取上次签到时间
function getLastSignedTime() public view returns (uint256) {
return signedMap[msg.sender];
}
//取消签到
function unsigned() public {
delete signedMap[msg.sender];
}
//管理员删除用户签到
function adminUnsigned(address addr) onlyAdmin public {
delete signedMap[addr];
}
//管理员获取用户签到时间
function adminGetLastSignedTime(address addr) onlyAdmin public {
return signedMap[addr];
}
}
执行
这里使用truffle开发工具. 部署
truffle.cmd develop
migrate --reset
在Hello的构造函数指定了合约发布者(即用户0)为管理员.
//导出实例
Hello.deployed().then(inst => {Hello = inst});
//用户1自己签到
Hello.signed({from:web3.eth.accounts[1]})
//用户1获取签到时间
Hello.getLastSignedTime({from:web3.eth.accounts[1]})
//管理员获取用户1签到时间
Hello.adminGetLastSignedTime(web3.eth.accounts[1], {from:web3.eth.accounts[0]})
//用户2(非管理员)获取, 执行失败
Hello.adminGetLastSignedTime(web3.eth.accounts[1], {from:web3.eth.accounts[2]})
//删除签到
Hello.unsigned({from:web3.eth.accounts[1]})
以上只是一个简单的例子, 介绍了下智能合约的运用. 前2个需求就是无中心, 最后一个需求则引入了中心(管理员),
就意味着合约上的数据可能被管理员修改. 但是用户还是能通过区块链浏览器来追宗数据的修改. 这点还是好过传统的服务器, 改了你都没法证明.
当然智能合约能起来写的东西非常多, 就看怎么运用了.