Solidity
從 Web 應用程序中的 Solidity 合約呼叫數組變數
我已經在solidity合約中聲明了一個數組,例如“ uint256$$ $$公共機器列表;" 並在建構子中初始化該數組的值。
但是當我在 js usgin web3 中呼叫該數組時,如下所述:
AssetContract.deployed().then(function(contractInstance) { let getMachineList = contractInstance.machineList; alert(getMachineList); });
它在 getMachineList 變數中返回以下輸出:
function () { var instance = this var args = Array.prototype.slice.call(arguments) var tx_params = {} var last_arg = args[args.length - 1] if (Utils.is_object(last_arg) && !Utils.is_big_number(last_arg)) { tx_params = args.pop() } tx_params = Utils.merge(C.class_defaults, tx_params) return C.detectNetwork().then(function () { return new Promise(function (accept, reject) { var callback = function (error, result) { if (error != null) { reject(error) } else { accept(result) } } args.push(tx_params, callback) fn.apply(instance.contract, args) }) }) }
我正在輸入的這種類型的數據
alert(contractInstance.machineList);
那麼,我們如何在不顯式地在solidity 中創建getter 函式而不是呼叫由solidity 為狀態變數提供的內置getter 函式的情況下在側JS 中獲取數組值?
你可以像這樣得到動態數組:uint256$$ $$通過創建合約 getter 函式來公開 machineList 。
function getMachineList () external returns (uint256[]){ return machineList }
注意我添加的外部修飾符,在這種返回動態大小數組的函式中,外部修飾符是強制性的。它還使該函式只能從合約的外部呼叫,這正是我們在這裡想要的。
另一件事是您正在使用truffle來呼叫合約函式。使用 truffle 時,您需要在函式名稱後呼叫promise(或回調):
AssetContract.deployed().then(function (contractInstance) { contractInstance.getMachineList. call(**arguments if any**,{ from:**address**, gas: 300000 }).then( data => { var MachineList = data; alert(MachineList); } ) })
**注意:**當您使用 truffle 時,
.call()
如果您只是呼叫讀取和返回變數的函式,就好像它不會改變狀態變數(更改/添加現有/新值)一樣。