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