我想用一家工厂,这样人们就可以签订一份标准化的合同。人们应该能够通过这种创造直接转移资金,这导致了我在msg.sender期间的问题。我读到tx.origin有一些安全缺陷,但我想知道这是否也适用于工厂创建合同。以下合同示例:
pragma solidity ^0.4.0;
contract Factory {
address[] public contracts;
function createContract ()
payable
public
{
Con newCon = (new Con).value(msg.value)();
contracts.push(newCon);
}
}
contract Con {
address owner;
uint256 valueOwner
;
function Con()
payable
public
{
owner = tx.origin;
valueOwner = msg.value;
}
function withdraw ()
public
{
if(msg.sender == owner)
msg.sender.transfer(valueOwner);
}
}我不明白为什么tx.origin会在这里造成任何伤害,或者我是不是漏掉了一点?
发布于 2018-04-19 07:02:56
当从另一个合同中调用工厂时,使用tx.origin会产生问题。
钱包(A)呼叫> multisig合同(B) >呼叫工厂(C) >分包合同(D)。
在这种情况下,tx.origin是钱包A。在大多数情况下,用户会期望所有者实际上是multisig合同,而不是A。
为了防止这种情况,只需在工厂C中使用msg.sender,并将其传递给新的契约实例D,最好是在第二个方法调用中,这样人们就可以轻松地使用没有构造函数参数的以太扫描代码验证器。
https://ethereum.stackexchange.com/questions/46014
复制相似问题