1

在以太坊智能合约开发时,可能会有以下需求:

仅接受用户转入指定价值的eth,如果用户转入eth较少,则直接返回异常,当用户转入eth较多,则将用户多转入的eth退回。

在这里我们可以借助 fallback function,也就是后备函数进行转入金额的限定,示例如下:

代码示例
contract Refund {
    
    address owner = 0x0;
  
    uint256 ticket = 1 ether;    // 一个eth
      
    // 合约构造函数
    // 第一次部署合约时,会调用该方法。
    // 之后执行合约不会调用。
    function Refund() public payable {
        // 将部署合约的地址作为合约拥有者
        owner = msg.sender;
    }
  
    // 后备函数
    function () public payable {
          require(msg.value >= ticket);
          if (msg.value > ticket) {
               var refundFee = msg.value - ticket;
            msg.sender.transfer(refundFee);
        }
    }
}
代码解释

public : 函数可见性

payable :可支付的函数修饰符,没有该修饰符无法接受转账操作。

msg.value :执行合约时,转账的eth数量,以wei为单位。

msg.sender : 执行合约的地址

<address>.transfer(uint256):给指定地址<address>进行转账

sendtransfer 的区别

<address>.transfer(uint256 amount)

发送给定数量的wei给指定地址,错误时抛出异常

<address>.send(uint256 amount) returns (bool)

发送给定数量的wei给指定地址,错误时返回false


我才是二亮
2.5k 声望52 粉丝

哈哈哈


8

引用和评论

8 条评论
头像
化作千风

大神。我想在转token的时候同时转以太坊。放在一笔交易中。能实现吗

2018-02-01
我才是二亮(作者)

@化作千风 以太坊中调用一个方法就是一次交易,你可以在你这个方法里面调用两次transfer方法,一次是eth的transfer,一次是你指定token的transfer,这就是一笔交易。你在这个方法里面做任何事情都可以,只要不超过你提供的gas就可以。

2018-02-05
慢慢

@化作千风 指定token的transfer能实现吗

2018-04-27
我才是二亮(作者)

@化作千风 @慢慢 那就是调用指定token的合约里面的transfer方法就行了

2018-04-27
头像
ceshi

大神.在github 找的prc api接口 eth_call 为什么返回不了参数!!

2018-02-13
头像
周铭辉

大神,智能合约能不能不调用就自动执行呢

2018-04-02
我才是二亮(作者)

@周铭辉 不可以,必须要触发智能合约的执行

2018-04-03
头像
black1_

大神,如何将合约里面的钱转出特定数量给特定的人 。我在函数中使用transfer转不了

2018-05-22