Transactions

如何將乙太值設置為函式參數?

  • May 5, 2021

我在 Truffle 工作,我的項目很簡單。contract A應該將一些乙醚轉移到contract B. contract A資金充足。在contract A中,有一個被稱為payment執行傳輸的函式uint val,它的參數告訴函式要傳輸的乙太值。每當我在 Truffle 控制台中嘗試該功能時,都會發生以下錯誤:

Error: invalid number value (arg="val", coderType="uint256", value=1000000000000000000)

我不知道如何分配一個正確的值作為payment函式的參數。

契約A:

pragma solidity ^0.5.12;

contract A{

   event Payment(address receiver, uint value);

   function payment(uint val) public payable returns(string memory){
       address(uint160(0xae1b77270ae418bDd72e14e842F57D9EC2DBD1d8)).transfer(val);\\Transfer to contract B
       emit Payment(0xae1b77270ae418bDd72e14e842F57D9EC2DBD1d8, val);
       return "Payment done successfully";
   }

   function() external payable{}
} 

契約乙:

contract B{
   function balanceView() public view returns(uint){
       return address(this).balance;           
   }

   function() external payable{}
}

我在 Truffle 控制台中嘗試的命令:

truffle(develop)> A.deployed().then(function(ins){app=ins})
undefined
truffle(develop)> app.payment.sendTransaction(1000000000000000000)

改變這個:

sendTransaction(1000000000000000000)

對此:

sendTransaction({value: '1000000000000000000'})

這是因為MAX_SAFE_INTEGERJavaScript。正如您在此處看到的,MAX_SAFE_INTEGER常數的值為90071992547409919,007,199,254,740,991~9千萬億)。該數字背後的原因是 JavaScript 使用雙精度浮點格式數字。它只能安全​​地表示 -(2^53 - 1) 和 (2^53 - 1) 之間的整數。除此之外,您使用uint並且不能使用此間隔的負部分。因此,您受到更多限制。您可以通過以下方式解決:

  1. 傳遞一個非MAX_SAFE_INTEGER.
  2. 正如@goodvibration 回答的那樣,刪除了.payment()參數並將您的給定值傳遞給.sendTransaction({value:<value>}).

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