http://www.7klian.com

如何防备滥用委托挪用成果


}
owner = msg.sender; // Save msg.sender to slot 0


// I did so in the console, having already computed
4、在以太坊中,您可以通过在事务中发送数据来挪用民众函数。名目如下:

to: "0xe3895c413b0035512c029878d1ce4d8702d02320",


function() public {
function pwn() public {
address public owner; // Occupies slot 0
from: "0x1733d5adaccbe8057dba822ea74806361d181654",




6、wait contract.owner()显示您此刻是所有者!
delegateCall()的利益是可以保存当前挪用合约情况的内容。此情况包罗其storage及其msg.sender,msg.value属性。

3、留意,委托条约的槽0也存储了owner,确切地说是您想要变动的变量!另外,假如您设法挪用Delegation.sol中的回退函数来挪用pwn(),您将成为挪用合约的所有者。



}
contractInstance.call(bytes4(sha3("functionName(inputType)"))
要害细节

data: "0xdd365b8b0000000000000000000000000000000000000000000000000000000000000000"
2、留意Delegate.sol有一个名为pwn()的民众函数,它将所有者变量的所有权变动为挪用该函数的任何人!
显然,当开拓人员在不安详的存储情况中利用delegatecall()或从恶意库担任时,安详风险就会产生


1、delegation.sol对库合约delegation.sol举办delegatecall。
假如存储变量是通过初级的delegatecall会见的,那么两个合约的存储机关必需对等,以便被挪用合约可以或许按名称正确会见挪用合约的存储变量。虽然,假如将存储指针作为函数参数通报,就像在高级库中那样,环境就不是同了。
if(delegate.delegatecall(msg.data)) {
...
可是此刻插槽0是引用指针foo,因此foo配置为x。bar仍然超出范畴,没有受到影响。


以太坊将数据存储在存储“插槽”中,即32字节巨细的插槽。每次将变量生存到存储时,它会自动占用当前插槽中的剩余空间,可能按顺序占用下一个插槽。


· 对换用delegatecalls的函数举办身份验证并举办条件查抄。


· 变动条约存储的库担任时,请确保将存储插槽与库的存储插槽对齐,以制止呈现这些边沿环境。

this;
}
细节演练

委托挪用(delegatecall)


});
此刻操作您对delegatecall()的领略来得到此级别条约的所有权!
当合约A向合约B发出委托挪用时,它答允合约B自由地改变其存储A.
接下来,执行thesaveX函数。请留意,最初合约B存储到存储槽0中。因此,,当此函数此刻引用变量bar时,再次查察槽0。

await sendTransaction({
}

首先,Contract A通过delegatecall挪用saveX函数。委托挪用包围合约B的存储与存储挪用合约akaStorage A.



5、利用Remix IDE或节制台,挪用Delegation.sol的回退成果:

提示:您可以执行Remix调试器(在Javascript VM模式下)以查察存储情况

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。