Solidity

由另一個契約和例外創建的契約

  • January 25, 2017

我有兩個關於契約創建和例外的問題:

  1. 如果contractA創建了contract B,然後throws在同一個函式里,B也被刪除了?
  2. 如果 contract在其建構子中A創建 contractBB throws,異常是否會冒泡A
  1. 是的

B``B如果包含創建的事務有異常,則不會創建。例子:

pragma solidity ^0.4.8;

contract A {
   B public b;
   function foo() {
       b = new B();
       throw;
   }

   function getXfromB() returns (uint) {
       return b.x();
   }
}

contract B {
   uint public x;

   function B() {
       x = 1;
   }
}

使用browser-solidity 快速測試,先註釋掉throw. 然後“創建” A,點擊foo,然後點擊b查看它的地址,點擊getXfromB查看得到1。取消註釋throw即可看到B未創建:點擊b查看為0x0。

呼叫中的異常會導致所有更改(在該呼叫中)被還原,並且合約創建沒有什麼特別之處可以防止它被還原。有關更多資訊,請參閱拋出發生時整個事務是否恢復?

2.是的

Solidity 0.4已修復,因此如果new B()失敗,A將獲得異常。

通過“新”拋出失敗的契約創建

可以通過將throwinfoo移至 constructor來利用 #1 中的相同範例進行測試B()

引用自:https://ethereum.stackexchange.com/questions/11627