Solidity

智能合約觸發發送不在合約中的乙太交易

  • February 17, 2022

我的智能合約需要一些幫助,這是智能合約程式碼

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 無法自動將乙太幣發送到任意帳戶。

希望能幫助到你!

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