Solidity
僅使用 Solidity 和字節碼將庫連結到智能合約
我在 Truffle 開發環境中工作並使用 Windows PowerShell。我的 Solidity 程式碼是一個測試程式碼,很簡單。有一個名為的庫
Alireza
,它只比較兩個 uint 值。有一個合約呼叫B
,它只使用庫函式來比較兩個 uint 值。現在,我需要連結Alireza
到B
. 為了那個原因
using-for
我將命令嵌入到B
.- 我部署
Alireza
並獲得了它的地址。- 我嘗試部署
B
以創建其字節碼。不出所料,部署失敗了。Alireza
我將 ’ 的地址嵌入到B
’ 的字節碼中。因為,正如我搜尋的那樣,這是一種連結方式。- 我嘗試再次部署
B
,但再次失敗。這個工作流程正確嗎?我不知道。所以,我打算嘗試這裡提到的另一種方式:
- 我試圖將
Alireza
’ 標題或目錄的雜湊嵌入B
’ 字節碼。就像:--$12b85d948918b1e5773c9bc099694fc73b$--
- 我嘗試部署
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]); };