Solidity
智能合約觸發發送不在合約中的乙太交易
我的智能合約需要一些幫助,這是智能合約程式碼
pragma solidity ^0.4.18; contract UserToken { mapping (bytes32 => uint8) public tokenBalance; bytes32[] public userList; // Constructor function UserToken(bytes32[] userName) public payable { userList = userName; } // Returns the total votes a candidate has received function totalTokensFor(bytes32 user) view public returns (uint8) { require(validUser(user)); return tokenBalance[user]; } // Increments the token count of user function buyToken(bytes32 user, uint8 token) public { require(validUser(user)); tokenBalance[user] += token; } function validUser(bytes32 user) view public returns (bool) { for(uint i = 0; i < userList.length; i++) { if (userList[i] == user) { return true; } } return false; } }
我有一個連接到 rinkeby 並在 AWS 中的 ec2 實例上執行的 geth 節點,從那裡我創建了 eth 帳戶地址,然後將 JSON 文件導入到 metamask。
現在這就是問題所在,每當我呼叫函式“ buyToken ”時,它都會觸發四筆交易
第一個交易是這個https://rinkeby.etherscan.io/tx/0x3206678cdd6fdcfc4eddf3871002b77320d5e83f3bb5f9e2d9c0c0aa9bbc8817
向另一個地址 w/c 的乙太幣轉移不在合約中,而它轉移的乙太
2.994817 Ether
幣又不在合約中,因此由於賬戶餘額不足,導致接下來的三筆交易消失,原始賬戶餘額為 3 乙太幣.這是呼叫 BuyToken 的程式碼
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); var userContract = web3.eth.contract(ABI); var userInstance = userContract.at(contract address) $("#buy_button").click(function(e) { let tx_hash = userInstance.buyToken("John", 3); e.preventDefault(); });
我的問題是為什麼會這樣?我的合約中沒有任何乙太幣轉賬程式碼,這可能是什麼原因?
謝謝
當您的程式碼清楚地指向您自己的本地鏈時,您為什麼要為 Rinkeby 指代 Etherscan?http://localhost:8545不是 Rinkeby 提供者。
您到 Rinkeby 的連結可能完全來自其他人的操作,並且您的程式碼指向您自己的本地 geth 實例
這不是由於您的契約,而是由於您的網路設置。
請檢查您連接的網路,您的問題似乎是您正在創建自己的網路。讓我們來解決問題。由於您進行了以下配置,可能會發生此類問題 -
您的網路設置
- 您配置了在 AWS 中執行的節點正在驗證節點。
- 您在同一驗證節點中啟用了 RPC 埠。
- 您解鎖了帳戶,因此您的驗證節點可以正常工作。
這是由於 geth 遇到了這個問題,而且我們多次遇到這個問題。禁用驗證節點的 rpc 埠並再添加一個節點與區塊鏈互動,該節點應該沒有任何未鎖定的帳戶,因此您的 geth 無法自動將乙太幣發送到任意帳戶。
希望能幫助到你!