美文网首页
智能合约运用

智能合约运用

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

    相关文章

      网友评论

          本文标题:智能合约运用

          本文链接:https://www.haomeiwen.com/subject/jddzuftx.html