Blockchain 中继智能合约设计

Blockchain 中继智能合约设计,blockchain,ethereum,solidity,smartcontracts,Blockchain,Ethereum,Solidity,Smartcontracts,我正在尝试建立一个中继智能合约,它可以在另一个部署的智能合约的函数调用中传递msg.value和msg.sender 上下文:目标是使用multiples DeFi协议(已部署且不归me合同所有)创建/借用一个主智能合同,以便只处理一个钱包。这意味着资金(msg.value?)和所有者(msg.sender?)在调用交易的函数中转移到DeFi智能合约 EOA=带一点以太币的钱包 中继=中继智能合约,必须从DeFi智能合约接收资金(=作为消息发送方?) proxyDeFi=代理智能合约,允许在一次

我正在尝试建立一个中继智能合约,它可以在另一个部署的智能合约的函数调用中传递
msg.value
msg.sender

上下文:目标是使用multiples DeFi协议(已部署且不归me合同所有)创建/借用一个主智能合同,以便只处理一个钱包。这意味着资金(
msg.value
?)和所有者(
msg.sender
?)在调用交易的函数中转移到DeFi智能合约

EOA=带一点以太币的钱包

中继=中继智能合约,必须从DeFi智能合约接收资金(=作为
消息发送方
?)

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

在我看来,
delegatecall
允许在执行另一个智能合约的功能时传递
msg.sender
msg.value
,因此我目前所做的是:

当EOA调用proxyDeFi时,proxyDeFi按预期工作,但proxyDeFi是查询的DeFi智能合约的
msg.sender
,而不是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的函数来中继(使用EOA),但事务在
deletegateCall
上被系统地还原。我试图在proxyDeFi端添加一个调试,但没有任何输出,我对Solidity是新手,所以肯定有一些我不理解的东西


大致上,我希望proxyDeFi只被认为是中继的库,除了proxyDeFi将是另一个部署的智能合约,这样我们就可以修改它而不必重新部署中继。我有一种感觉,我想要达到的目标实际上比这更复杂,或者我的方法可能不是正确的/最好的。我非常感谢您的建议。

您不需要尝试发明自己的设计,只需使用/继承OpenZeppelin代理合同:事实上,OpenZeppelin的代理/逻辑与我所寻找的非常相似,除了可能为同一代理合同拥有多个逻辑合同,或者我误解了?我认为还有另一种模式可能适合您的用例,称为Diamond,您不需要尝试发明自己的设计,只需使用/继承OpenZeppelin代理合同:事实上,OpenZeppelin的代理/逻辑看起来很像我要找的,除了为同一个代理契约拥有多个逻辑契约的可能性,或者我误解了吗?我认为还有另一种模式可能适合您的用例,称为Diamond