首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂用tx.origin

工厂用tx.origin
EN

Ethereum用户
提问于 2018-04-18 11:45:36
回答 1查看 318关注 0票数 2

我想用一家工厂,这样人们就可以签订一份标准化的合同。人们应该能够通过这种创造直接转移资金,这导致了我在msg.sender期间的问题。我读到tx.origin有一些安全缺陷,但我想知道这是否也适用于工厂创建合同。以下合同示例:

代码语言:javascript
复制
 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会在这里造成任何伤害,或者我是不是漏掉了一点?

EN

回答 1

Ethereum用户

发布于 2018-04-19 07:02:56

当从另一个合同中调用工厂时,使用tx.origin会产生问题。

钱包(A)呼叫> multisig合同(B) >呼叫工厂(C) >分包合同(D)。

在这种情况下,tx.origin是钱包A。在大多数情况下,用户会期望所有者实际上是multisig合同,而不是A。

为了防止这种情况,只需在工厂C中使用msg.sender,并将其传递给新的契约实例D,最好是在第二个方法调用中,这样人们就可以轻松地使用没有构造函数参数的以太扫描代码验证器。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/46014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档