智能合约运用

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个需求就是无中心, 最后一个需求则引入了中心(管理员),
就意味着合约上的数据可能被管理员修改. 但是用户还是能通过区块链浏览器来追宗数据的修改. 这点还是好过传统的服务器, 改了你都没法证明.
当然智能合约能起来写的东西非常多, 就看怎么运用了.

上一篇下一篇

猜你喜欢

热点阅读