Solidity

是否可以在乙太坊交易的 DATA 欄位中插入一些自定義數據?

  • June 6, 2021

我正在嘗試將一些數據編碼/插入到乙太坊交易中。

讓我先描述一下我的環境,我正在使用 Web3py、Ganache 和 Remix IDE。我能夠成功地在三者之間進行通信,因為我可以在 Jupyter Notebook 中編寫 Python 程式碼,該程式碼成功地與部署在 Remix 上的合約進行互動。我可以看到 Ganache 中的每一筆交易。

現在,我的任務是在乙太坊區塊鏈上儲存一些數據(不一定是主網,如果可以在本地 RPC 甚至測試網上完成就足夠了。)

我正在嘗試發送以下原始交易

tx = {
   'nonce': nonce,
   'to': address,
   'value': web3.toWei(1, 'ether'),
   'gas': 2000000,
   'gasPrice': web3.toWei('10', 'wei'),
}

到我的智能合約,使用

web3.eth.sendRawTransaction

但是,我在 web3py 中收到以下錯誤(這是一個巨大的錯誤,但這似乎是相關的部分,如果您需要我會發布整個錯誤。)

'message': 'VM Exception while processing transaction: revert', 'code': -32000

然後嘗試使用這個命令

web3.eth.sendTransaction({
   'nonce': nonce,
   'to': address_of_contract,
   'value': web3.toWei(1, 'ether'),
   'gas': 2000000,
   'data' : '7b224e616d65223a202',
   'gasPrice': web3.toWei('10', 'wei'),
})

無論我在此命令中包含數據欄位還是排除它,它都會給出相同的錯誤;

'message': 'VM Exception while processing transaction: revert', 'code': -32000

請幫幫我。

我只想找到一種在事務中發送數據(一些十六進製字元串或十六進製字節)的方法。

讓我知道乙太坊中任何此類功能存在哪些可能性。

謝謝你。

編輯:@iamdefinitelyhuman 要求的契約程式碼

pragma solidity ^0.4.17;

contract Inbox {
   string public message;
   string[] hex_storage;
   address owner;

    event printHex(string x);

   function Inbox(string initialMessage) public payable {
       owner = msg.sender;
       message = initialMessage;
   }

   modifier isOwner {
       require(msg.sender == owner);
       _;
   }

   function setMessage(string newMessage) public 
   {
       message = newMessage;
   }
       function getMessage() public view returns (string) 
       {
           return message;
       }

   function storeMember(string hex_data) public 
   {
       hex_storage.push(hex_data);
   }

   function showMember() public 
   {
       for (uint i=0; i<hex_storage.length; i++)
       {
           printHex(hex_storage[i]);
       }
   }

   function cleanOutBalance() isOwner public  
   {
       uint bal = address(this).balance;
       address(owner).transfer(bal);
   }

   function displayBalance() public view returns (uint)
   {
       uint bal = address(this).balance;
       return bal;
   }


}

所以我知道契約程式碼並不完美,但大多數函式執行基本的東西(獲取、設置、將數據推送到數組)

我想用我的交易來定位storeMember函式。但是,根據我在 Solidity 上了解到的情況,當您從前端呼叫智能合約函式時,交易在其數據欄位中包含目標函式的一些數據,因此如果我是,則無法更改該欄位從前端呼叫智能合約函式。(如果我對這個概念有誤,請糾正我)

因此,我試圖在不呼叫任何函式的情況下向契約發送自定義交易(不是原始交易)。希望它可以讓我不受任何限制地修改數據欄位。(我也嘗試過原始交易,但它們顯示的錯誤與上面列出的相同)

請讓我知道我是否可以採取任何額外的步驟或預防措施來允許我在交易的數據欄位中編碼數據。

乙太坊有兩種交易,一種是簡單的餘額轉賬,另一種是對合約進行任何修改(可以是合約部署/合約的方法呼叫)。

乙太坊原始交易 json 結構中的“**數據”欄位包含在 EVM 中執行交易的程式碼。**在合約部署的情況下,“數據”欄位包含合約的字節碼以及呼叫建構子的參數(如果有)。在方法呼叫的情況下,“數據”包含方法簽名和參數。在“餘額轉移”的情況下,它是沒有用的。如果您提供,它將被閒置。

因此,您不能在不發出交易的情況下修改區塊鏈中的任何數據(餘額或已部署合約中的任何欄位)。如果需要修改的欄位屬於合約,您必須公開一個設置該欄位的方法,並且您擁有通過事務呼叫它。在這種情況下,在您的原始交易中,“數據”欄位將包含方法的簽名和以乙太坊期望的方式編碼的參數列表。

如果您想進行自己的自定義交易,您必須更改乙太坊的原始碼。

希望能幫助你理解。

是的,可以將自定義數據放在事務的 DATA 欄位中。但是您應該注意可能有害的程式碼執行。

您可能會得到回复,因為您的合約沒有回退功能,也沒有 id 的功能7b224e61。(鑑於您的“數據”:“7b224e616d65223a202”)

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