Solidity
Web3 Rinkeby Infura 問題
我有一個智能合約,當部署到
localhost: 8545
(使用Ganache
)我的Web3
Dapp 時,它可以完美執行。但是當我戴上它時Rinkeby
,我遇到了問題。Contract 非常簡單:它所做的只是讓你設置和獲取值
uint
變數x
:pragma solidity ^0.4.16; contract Incrementor { uint x; constructor() public { // Give x in initial value of 10: x = 10; } function getX() external view returns (uint xValue) { return (x); } function incrementX(uint byThisMuch) public { x += byThisMuch; } }
在成功執行它之後,
localhost: 8545
我現在已經將它部署到了Rinkeby
TestNet(通過Remix
)並Infura
用來連接它——但我突然在那裡遇到了不一致的行為。具體來說,我的getX()
函式有效,但我的 setterincrementX()
函式給了我錯誤:它基本上沒有選擇我的地址。
注意:這個問題甚至在2018 年 11 月 6 日更新之前就已經發生
Metamask
這是我在我的設置
Web3
中的方式HTML
:if(typeof(web3) !== 'undefined') { console.log("Web3 provider found! Current Provider is WORKING!"); web3 = new Web3(web3.currentProvider); } else { console.log("1. NO Web3 provider found! Gonna set one up..."); // Connect to Infura: web3 = new Web3(new Web3.providers.HttpProvider("https://rinkeby.infura.io/v3/<MY API KEY")); // Or use this when connecting to `localhost`: // web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); console.log("2. OK, NOW we DO have a PROVIDER --> HttpProvider = ", web3.providers.HttpProvider); web3.eth.defaultAccount = web3.eth.accounts; console.log("3. ALL ACCOUNT - web3.eth.accounts = ", web3.eth.accounts); console.log("4. web3.eth.defaultAccount = ", web3.eth.defaultAccount); // Also tried with 'getAccounts' (same as `.accounts` - but asynchronous) console.log("5. web3.eth.getAccounts() ==> ", web3.eth.getAccounts()); web3.eth.getAccounts(function(error, result) { if(error != null) console.log("7. Error! ", error); else console.log("7. Result = ", result); }); console.log("Exiting the WEB3 JAM!"); };
同樣,請參閱上面的控制台日誌以查看發生了什麼。
奇怪的是,我確實在連接智能合約並與之交談
Rinkeby
——我知道這一點是因為我的getX()
按鈕點擊操作返回了正確的值:但是當我嘗試設置它時 -那就是我得到那個錯誤的時候。
真的,更多的是關於我的地址不斷返回的事實
undefined
——我認為這是真正的問題:這是應用程序界面的快速螢幕截圖:
Infura 不保存您的密鑰。當您連接到本地節點時,這是因為您的本地節點有您的帳戶。您需要通過載入密鑰來手動設置您的帳戶。之所以
getX
有效,是因為該功能是視圖,可以在 Infura 節點中執行而無需發送交易。incrementX
更改合約狀態,因此您需要送出交易。我推薦使用像 Metamask 這樣的密鑰管理器,相反,你需要公開你的密鑰來簽署交易。