首页 > 解决方案 > 中继智能合约设计

问题描述

我正在尝试制作一个中继智能合约,它可以通过另一个已部署的智能合约msg.valuemsg.sender函数调用。

背景:目标是使用多个 DeFi 协议(部署且不属于我的合约)与一个主智能合约进行铸造/借用,以便只有一个钱包可以处理。这意味着资金 ( msg.value?) 和所有者 ( msg.sender?) 在调用交易的函数内转移到 DeFi 智能合约。

EOA = 一个带有一点 ETH 来支付费用的钱包

Relay = 中继智能合约,必须从 DeFi 智能合约接收资金(= 作为msg.sender?)

proxyDeFi = 代理智能合约,允许在一笔交易中向一个或多个 DeFi 智能合约发送多个请求

在我看来,delegatecall允许在执行另一个智能合约的功能时传递msg.sendermsg.value,所以到目前为止我做了什么:

当 EOA 调用 proxyDeFi 时,它按预期工作,但 proxyDeFi 是msg.sender用于查询的 DeFi 智能合约,而不是 EOA。我们需要几个可以经常更新的代理合约,所以我尝试做一个简单的中继:

contract Relay {
    address public proxyDeFi;
    address owner = msg.sender;
    
    modifier isOwner() {
        require(msg.sender == owner, "Forbidden");
        _;
    }

    function update(address newAddress) isOwner public {
        proxyDeFi = newAddress;
    }

    fallback() isOwner external payable {
        proxyDeFi.delegatecall(msg.data);
    }
}

我尝试将 proxyDeFi 的函数调用到 Relay(使用 EOA),但交易在deletegateCall. 我尝试在 proxyDeFi 端添加调试,但没有任何输出,我是 Solidity 的新手,所以肯定有一些我不明白的地方。

粗略地说,我希望 proxyDeFi 仅被视为中继的库,除了 proxyDeFi 将是另一个部署的智能合约,因此我们可以修改它而无需重新部署中继。我有一种感觉,我想要实现的实际上比这更复杂,或者我的方法可能不是正确/最好的方法。非常感谢您的建议。

标签: blockchainethereumsoliditysmartcontracts

解决方案


推荐阅读