Solidity

Solidity:未正確設置 uint 參數

  • December 29, 2021

用松露在本地測試我的契約。我有一個帶有簽名的函式:

function purchase(address buyer, address seller, bytes16 bookId, uint tokens) public onlyOwner returns(bool success)

在松露控制台中,我將此函式稱為:

 BookStore.deployed().then(function(instance){return instance.purchase(
'0xab67c3985384f5f4dc2fa828662f1f0601f81e62', //buyer
'0xd74ea687cc995cbbc1af6cf81106b31e32b4aa4f', //seller
[108, 120, 118, 13, 168, 153, 70, 225, 139, 168, 108, 184, 185, 58, 173, 17], //id
5) //tokens
;}).then(function(result){return result;});

當我調試交易時,我看到它tokens具有價值2.316897056402557e+76!但我通過了 5 .. 發生了什麼事?

問題與我為該bookId欄位傳遞的字節數組有關。bookId用固定的奇怪值的十六進制值替換這些字節tokens。我的預感是該數組佔用 > 16 字節,這溢出了uint tokens值。

回复:預感,不。

你的期望是錯位的。這是一個未標記viewpure(只讀)的狀態更改函式,這是正確的,因為您確實希望該函式更新狀態。我們看不到程式碼,但這似乎是“set”,而不是“get”。

現在,在所有這些狀態變化的情況下,回調的預期結果是交易收據,而不是return價值。返回值會返回給其他合約,但不會返回到發起交易的 EOA。您會收到一份收據,作為交易已送出到您的節點的確認,大概是要傳遞到網路。返回的交易雜湊是交易的唯一標識符,因此您可以對其進行檢查。

你不會得到結果,因為在交易被探勘之前結果是不可知的。您可以檢查/等待交易被包含在一個塊中(通過返回的雜湊),然後檢查新狀態。

這是一個令人困惑的話題。這是合乎邏輯的,但需要一些時間來了解它的邏輯。看看這個解釋器:https ://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2

希望能幫助到你。

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