以太坊智能合约之间的调用

本文探讨了在以太坊智能合约中如何调用其他合约的方法,包括CALL、DELEGATECALL和CALLCODE。由于这些方法在msg.sender和msg.value等方面存在不同限制,因此在实际需求中,例如从合约A调用代币合约C的transfer函数转移代币,需要用户首先批准操作,然后调用depositToken方法来完成转账。这种方式确保了调用的正确性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有个新的需求
已经有一个代币合约如C,需要实现一个合约,在这个合约中调用代币合约C中的transfer函数,即转代币的函数。

要在一个合约中调用另一个合约,可用用以下三种方式调用。

  • CALL:最常用调用,内置变量msg的值会被修改为调用者,执行环境为被调用者的运行环境。
  • DELEGATECALL:调用后内置变量msg的值不会修改为调用者,但执行环境为调用者的运行环境。
  • CALLCODE和DELEGATECALL: 是在调用者的上下文中执行, 可以修改调用者的storage; CALLCODE 阻止msg.sender和msg.value传递;
    而DELEGATECALL不阻止;

在A的合约中,B.callcode(c的函数): c看到msg.sender是B;
在A的合约中,B.delegatecall(c的函数): c看到msg.sender是A;

可以看到,这三种方式都并不符合我们的需求。
方法只有,先让用户调用代币合约C中的approve方法,再调用下面实现的合约中的depositToken方法。
pragma solidity ^0.4.25;

contract Deposit {
   
   
    
    bool public stopped = false;
    uint256 public totalDeposit=0;
    uint256 minDepositValue;
    address owner;
    address cTokenAddr=0x01c2ce7bd1bc34eed8a99d0ea0abee305362c143;
    uint256 minBlockGap;
    mapping(address => mapping(string=>uint256))  depositRecords;
    mapping(address=>mapping(string=>uint256))  withdrawRecords;
    uint256 public account=0;
    
    uint256 public blocknum ;
   
    constructor(uint256 _minValue,uint256 _minBlockGap) public {
   
   
        owner=msg.sender;
        minDepositValue=_minValue;
        minBlockGap=_minBlockGap;
    }
    
    event Withdraw(address indexed _from, string indexed _pk, uint indexed _value);
    event DepositToken(address indexed _from,address indexed _to,uint256 indexed _value);


    function depositToken(address _to,uint256 _value,string pk) public isRunning  validAddres
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值