Remix
如何在 Remix 中使用 msg.data 發送交易?
回退函式可能會接收額外的數據(在 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
請注意,以這種方式發送值時,接收帳戶可能會以您意想不到的方式回調此函式。不建議以此處所述的方式發送值。