Remix

如何在 Remix 中使用 msg.data 發送交易?

  • April 3, 2022

回退函式可能會接收額外的數據(在 msg.data 中公開)。如何在 Remix 中發送包含其他數據的交易?

我不相信你現在可以使用 Remix 發送數據。您可以做的是使用 Metamask 執行相同的操作。

如果你呼叫的是回退函式,那麼你可以簡單地打開 Metamask,向合約發送交易,並在Hex Data交易表單的欄位中包含數據。

您也可以使用其他客戶端,例如 MyCrypto,但我不相信您可以在 Remix 中執行此操作。

解決方法

上面接受的來自 Shane 的回答是正確的,即使您可以使用大多數錢包進行操作,您也不能直接在 Remix 中發送數據。

但是,您可以做以下解決方法:在 Remix 中創建一個非常小的合約,其中包含一個接受地址、金額和一些數據的函式,如下所示:

pragma solidity >=0.5.0 <0.7.0;

contract sendData {

   function transferToWithData(address payable dest, uint amount, bytes memory data) public payable {

       dest.call.value(amount)(data);
   }
}

部署此功能後,您可以在 Remix 中呼叫此函式,並使用收件人地址、金額和您想要傳輸的數據。然後,合約會將包含數據的金額發送到收件人地址。

測試它是否有效

要測試它是否有效,請像這樣制定接收契約:

pragma solidity >=0.5.0 <0.7.0;

contract receiveData {

   bytes public data;

   function () external payable {
       data = msg.data;
   }
}

然後transferToWithData使用 3 個參數呼叫函式,例如:

"0x72db24a976ebbf64cd2d3c14f30e6db4ea812440", 1000, "0x00112244"

當然,地址必須是receiveData契約的地址。

然後在 Remix 中呼叫自動創建的 getter data,它會給你0: bytes: 0x00112244,這意味著接收者得到了數據。

在大多數使用者錢包中,收件人將能夠查看它,否則應諮詢區塊鏈上的交易本身。

call關於使用with 的警告value

請注意,以這種方式發送值時,接收帳戶可能會以您意想不到的方式回調此函式。不建議以此處所述的方式發送值。

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