Solidity

僅使用 Solidity 和字節碼將庫連結到智能合約

  • October 10, 2021

我在 Truffle 開發環境中工作並使用 Windows PowerShell。我的 Solidity 程式碼是一個測試程式碼,很簡單。有一個名為的庫Alireza,它只比較兩個 uint 值。有一個合約呼叫B,它只使用庫函式來比較兩個 uint 值。現在,我需要連結AlirezaB. 為了那個原因

  1. using-for我將命令嵌入到B.
  2. 我部署Alireza並獲得了它的地址。
  3. 我嘗試部署B以創建其字節碼。不出所料,部署失敗了。
  4. Alireza我將 ’ 的地址嵌入到B’ 的字節碼中。因為,正如我搜尋的那樣,這是一種連結方式。
  5. 我嘗試再次部署B,但再次失敗。

這個工作流程正確嗎?我不知道。所以,我打算嘗試這裡提到的另一種方式:

  1. 我試圖將Alireza’ 標題或目錄的雜湊嵌入B’ 字節碼。就像:
--$12b85d948918b1e5773c9bc099694fc73b$--
  1. 我嘗試部署B一次又一次部署失敗。

甚至,在我提到的所有方式之前,我在B沒有部署Alireza之前就部署了。因為我想也許通過這種方式,編譯器會創建連結。但是,出現以下錯誤:

Error: B contains unresolved libraries. You must deploy and link the following libraries before you can deploy a new version of B: Alireza

我的方式正確嗎?我的問題在哪裡?我如何僅通過 Solidity 和合約的字節碼而不使用 node-js 將庫連結到合約?我應該如何改變我的工作流程來連結?

我的整個程式碼:

pragma solidity ^0.5.12;

library Alireza{

   function comparison(uint a, uint b) view public returns(bool){  
       if(a==b){
           return true;
       }else{
           return false;
       }
   }
}

contract B{

   using Alireza for uint;

   function assessment(uint m, uint n) view public returns(bool){
       return m.comparison(n);
   }
}

謝謝你。

只需編譯程式碼和部署合約 B,不需要做連結的事情。庫程式碼將由編譯器自動複製到合約 B。

我最近也面對這些錯誤!原來需要額外的設置,稱為遷移……

Truffle – Running Migrations –deployer.link(library, destinations)部分介紹瞭如何連結庫和合約。

TLDR

./migrations/99_link_example.sol

const Alireza = artifacts.require("Alireza");
const B = artifacts.require("B");

module.exports = (deployer, _network, accounts) => {
 deployer.deploy(Alireza);
 deployer.link(Alireza, B);
 deployer.deploy(B);
};

deployer.link位是允許使用的魔術線B``Alireza

獎金提示

  • 如果您在其建構子中有一個需要參數的契約,那麼可以在.deploy階段定義它們
  • 該*accounts*參數包含一組測試帳戶地址,這些地址也可能有用

./contracts/Name.sol

contract Name {
   address public owner;

   function constructor(address _owner) {
       owner = _owner;
   }
}

./migrations/2_deploy_name.js

const Name = artifacts.require("Name");

module.exports = (deployer, _network, accounts) => {
 deployer.deploy(Name, accounts[0]);
};

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