Ethereum 关于合同调用另一个合同的问题

Ethereum 关于合同调用另一个合同的问题,ethereum,solidity,Ethereum,Solidity,需要两个相关坚固性问题的帮助 问题1。比如说,我有一份合同叫另一份: contract B { function f1() { ... } } contract A { B b; function f() { b.f1(); } } f1的msg.sender是否与f()相同?当然,它是合同的地址吗 问题2。 喂,我有合同A和B。 我想要 contract A { B b; A(address addr) { b = B(addr

需要两个相关坚固性问题的帮助

  • 问题1。比如说,我有一份合同叫另一份:

    contract B {
      function f1() {
         ...
      }
    }
    
    contract A {
      B b;
    
      function f() {
        b.f1();
      }
    }
    
  • f1
    msg.sender
    是否与
    f()
    相同?当然,它是合同的地址吗

  • 问题2。 喂,我有合同A和B。 我想要

    contract A {
      B b;
    
      A(address addr) { 
        b = B(addr); 
      }
    }
    
  • 在另一种语言中,我会使用
    bb=null,以避免双重初始化,但它不能稳定工作。那么,我如何声明一个成员变量,然后通过地址初始化它呢

    f1的msg.sender是否与f()相同?当然,这会是你的地址吗 合同

    msg.sender
    将是合同A的地址。如果要引用原始呼叫者,请使用
    tx.origin

    那么,如何声明一个成员变量,然后通过 地址

    声明成员变量时,不需要担心初始化问题。Solidity中的所有变量都有默认值。你可以这样做:

    contract B {
        address sender;
    
        function B(address addr) {
            sender = addr;
        }
    }
    
    contract A {
        B b;
    
        function A(){
            b = B(msg.sender);
        }
    }
    

    谢谢,亚当。但对于第二个问题:当我宣布B;,应该调用默认构造函数,对吗?所以我付了钱…不,构造函数只被调用一次,每个契约只有一个构造函数(从:“创建契约时,其构造函数(与契约同名的函数)执行一次。构造函数是可选的。只允许一个构造函数,这意味着不支持重载。”)。合约变量将初始化为0的内部字节表示形式。看见