Solidity

如何使用 web3.js(瀏覽器)和遠端節點呼叫狀態更改函式?

  • April 17, 2019

Solidity 合約:

contract MyContract {
   bytes32 public product;
   uint public amount;

   function setOrder(bytes32 _product, uint _reorderAmount,) public returns (bool success);   
}

Javascript web3js(沒有node.js):

<script src="./web3.min.js"></script>
<script>
web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/key"));
web3.eth.defaultAccount = "0x...address of my account...";
var myContract = web3.eth.contract([...abi...]);
var contractInstance = myContract.at('0x...contract address...');
contractInstance.setOrder(web3.toHex('ProductName'),3000);
</script>

這在我執行 ganache-cli 時有效,但在測試網(例如 Ropsten)上無效。在測試網上,我只能使用 getter 函式,但是如何呼叫 setter 函式呢?我在這裡想念什麼?

交易必須使用發送賬戶的私鑰進行簽名。

您使用 Infura 作為您的 web3 提供商,並要求它為您發送交易。它不能這樣做,因為它不知道您帳戶的私鑰。

您需要自己編寫程式碼來簽署交易,或者(更典型的方法)在瀏覽器中使用像 MetaMask 這樣的 web3 提供程序。MetaMask 持有使用者的私鑰並代表他們簽署交易(在提示批准後)。

根據文件,您必須將contractInstance.setOrder(web3.toHex('ProductName'),3000);方法更改為

發送交易:(您的情況)

contractInstance.setOrder.sendTransaction(web3.toHex('ProductName'),3000, { from: ethaddress }, function(err, result){ ... })

如果您只想呼叫一個不更新狀態的函式(並且不花費任何成本):

contractInstance.product.call(param1, , function(err, result){ ... }) 

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