Truffle
通過腳本呼叫 Truffle 命令
我使用 Visual Studio 程式碼簽訂了以下契約
pragma solidity ^0.4.17; contract IDSCheck { mapping( string => string ) PersonHash; function AddHash(string name, string hash) { PersonHash[name] = hash; } function GetHash (string name) public returns (string) { return PersonHash[name]; } }
現在我想使用 exec 命令從松露中呼叫這個函式。
我使用以下命令編寫了一個名為 idscheck.js 的 js 文件
var IDSCheck = artifacts.require("./IDSCheck.sol"); module.exports = function (deployer) { var ss; IDSCheck.deployed().then(function(deployed){ ss=deployed; }); ss.GetHash.call("sal"); }
我得到一個輸出錯誤說
類型錯誤:無法讀取未定義的屬性“GetHash”……
我正在嘗試這樣做是在松露控制台中。主要目標是創建一個腳本,該腳本使用 truffle 控制台通過批處理文件執行,以獲取上述合約的 GetHash 函式的輸出。
您的問題是由
IDSCheck.deployed()
. 如果您之後立即呼叫,該變數ss
可能不會被初始化ss.GetHash()
。
.then()
在確定它在函式內正確初始化後,您可以通過執行呼叫來修復它。var IDSCheck = artifacts.require("./IDSCheck.sol"); module.exports = function (callback) { var ss; IDSCheck.deployed().then(function(deployed){ ss = deployed; // Here we are sure `ss` is initialized and it is safe to call `.GetHash()` ss.GetHash.call("sal"); }); // This code 'might' be excuted before the code inside `.then()` // ss.GetHash.call("sal"); }
改變這個:
var IDSCheck = artifacts.require("./IDSCheck.sol");
對此:
var IDSCheck = artifacts.require("./IDSCheck.sol").new();