Solidity

從 Web 應用程序中的 Solidity 合約呼叫數組變數

  • April 10, 2018

我已經在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()如果您只是呼叫讀取和返回變數的函式,就好像它不會改變狀態變數(更改/添加現有/新值)一樣。

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