Transactions
如何將乙太值設置為函式參數?
我在 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_INTEGER
JavaScript。正如您在此處看到的,MAX_SAFE_INTEGER
常數的值為9007199254740991
(9,007,199,254,740,991
或~9
千萬億)。該數字背後的原因是 JavaScript 使用雙精度浮點格式數字。它只能安全地表示 -(2^53 - 1) 和 (2^53 - 1) 之間的整數。除此之外,您使用uint
並且不能使用此間隔的負部分。因此,您受到更多限制。您可以通過以下方式解決:
- 傳遞一個非
MAX_SAFE_INTEGER
.- 正如@goodvibration 回答的那樣,刪除了
.payment()
參數並將您的給定值傳遞給.sendTransaction({value:<value>})
.