美文网首页林梓技术分享集
Solodity知识点集 — payable 修饰符与提现(七)

Solodity知识点集 — payable 修饰符与提现(七)

作者: 童蒙vlog | 来源:发表于2018-04-26 21:29 被阅读50次

    payable 修饰符

    payable 方法是让 Solidity 和以太坊变得如此酷的一部分 —— 它们是一种可以接收以太的特殊函数。

    在以太坊中, 因为钱 (以太), 数据 (事务负载), 以及合约代码本身都存在于以太坊。你可以在同时调用函数 并付钱给另外一个合约。

    contract OnlineStore {
      function buySomething() external payable {
        // 检查以确定0.001以太发送出去来运行函数:
        require(msg.value == 0.001 ether);
        // 如果为真,一些用来向函数调用者发送数字内容的逻辑
        transferThing(msg.sender);
      }
    }
    

    在这里,msg.value 是一种可以查看向合约发送了多少以太的方法,另外 ether 是一个內建单元。

    这里发生的事是,一些人会从 web3.js 调用这个函数 (从DApp的前端), 像这样 :

    // 假设 `OnlineStore` 在以太坊上指向你的合约:
    OnlineStore.buySomething().send(from: web3.eth.defaultAccount, value: web3.utils.toWei(0.001))
    

    注意这个 value 字段, JavaScript 调用来指定发送多少(0.001)以太。如果把事务想象成一个信封,你发送到函数的参数就是信的内容。 添加一个 value 很像在信封里面放钱 —— 信件内容和钱同时发送给了接收者。

    提现

    在你发送以太之后,它将被存储进以合约的以太坊账户中, 并冻结在哪里 —— 除非你添加一个函数来从合约中把以太提现。

    你可以写一个函数来从合约中提现以太,类似这样:

    contract GetPaid is Ownable {
      function withdraw() external onlyOwner {
        owner.transfer(this.balance);
      }
    }
    

    你可以通过 transfer 函数向一个地址发送以太, 然后 this.balance 将返回当前合约存储了多少以太。 所以如果100个用户每人向我们支付1以太, this.balance 将是100以太。

    你可以通过 transfer 向任何以太坊地址付钱。 比如,你可以有一个函数在 msg.sender 超额付款的时候给他们退钱:

    uint itemFee = 0.001 ether;
    msg.sender.transfer(msg.value - itemFee);
    

    相关文章

      网友评论

        本文标题:Solodity知识点集 — payable 修饰符与提现(七)

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