Solidity

Solidity 線上編譯器如何連結庫?

  • February 22, 2017

假設我有這個程式碼:

import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract Contract {
   using strings for *;

   // ...
}

對於這個solidity線上編譯器生成這個字節碼:

60606040523415600b57fe5b5b60338060196000396000f30060606040525bfe00a165627a7a723058207a17f097139e731ad961366b8214b226041a3cd4427248c94ea39ee29bafface0029

在這裡我沒有看到任何占位符來添加庫地址。但是當我部署字節碼時,它會成功創建一個合約。

那麼solidity線上編譯器是如何找到庫的地址的呢?

它如何知道在哪裡部署庫,即主網或測試網。我可以在主網和測試網中使用相同的字節碼,但庫地址在兩個網路中可能不同。也有專用網路。

在這種情況下,“strings”庫只有具有internal可見性的函式,因此庫中的所有函式都被複製到Contract合約中,因此從未部署過“strings”庫,因此沒有任何占位符來添加“strings”庫地址在Contract.

要知道它被複製的原因,請閱讀此http://solidity.readthedocs.io/en/develop/contracts.html#libraries

當您提到“solidity 線上編譯器”時,我假設您使用的是https://ethereum.github.io/browser-solidity/ 。

如果是這種情況,那麼當您“創建”您的 時會發生以下情況Contract

  1. importgithub 原始碼生成一個庫,編譯它,部署它,並將地址保存在記憶體中。
  2. 編譯器編譯您的Contract,然後將生成的字節碼連結到庫地址的地址。
  3. 然後將連結的字節碼部署到區塊鏈。

希望能澄清一下。我對 browser-solidity 項目的內部結構有點過時了,所以希望我不會讓你誤入歧途。

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