Go-Ethereum

return (bytes32,bytes32) ,返回實際交易地址而不是真實數據

  • January 5, 2022

我附上了我的契約,它在 populus 上執行良好並在 geth 上編譯。這是一個簡單的原始碼:Test() 函式將數據附加到我的庫中定義的鍊錶中。get() 函式的目標是以 byte32 格式檢索頭節點的數據。

我的目標是提取頭節點的數據(bytes32)。在我的契約中,我有以下函式 Test() 和 get()。

在楊樹上;當我呼叫 Link Contract 的 get() 函式時,我可以看到儲存在 Struct 數據中的值,它是 bytes32 類型。

my_contract.transact().Test();
contract_address = unmigrated_chain.wait.for_receipt(set_txn_hash)
output = my_contract.call().get();
print(output[0] + output[1]);
abc111 //this is my output result. String that is stored in head node  
      //printed correctly.

另一方面,在 geth 上(通過使用我的私有乙太坊區塊鏈),當我呼叫 get() 函式時,它不是返回 (bytes32,bytes32) 值,而是返回其交易地址值。

ret_value = link.get({from: eth.accounts[0]})
"0xb508d62ce8c32d792cccf41f04f607d93c672e3a7e53e3e9fedb433ecc1f7a83"

$$ Q $$在 geth 上,我如何獲取節點的數據(如 populus 上的“abc111”)值,因為在 geth 上,當我呼叫 get() 函式時,它返回事務的地址值而不是(bytes32,bytes32)。

注意:返回字元串可能是一種解決方案,因此如果我將數據類型從“bytes32”更改為“string”類型,則在庫中也可能是一種解決方案,我遇到了以下錯誤:**錯誤:**返回參數類型不可訪問的動態類型不能隱式轉換為預期類型(第一個返回變數的類型)字元串記憶體。

感謝您的寶貴幫助和時間。

來自這個原始實現的範常式式碼如下(https://github.com/ethereum/dapp-bin/blob/master/library/linkedList.sol):

library LinkedList {
     struct data {
       uint80 head;
       uint80 last;
       uint80 count;
       Item[] items; 
     }
     uint80 constant None = uint80(0);
     struct Item {
       uint80 prev;
       uint80 next;
       bytes32 data;
       bytes32 data2; 
     }

 /// Appends `_data` to the end of the list self. Pushes the _data.
 function append(data storage self, bytes32 _data, bytes32 _data2) {
   var index = uint80(self.items.push(Item({prev: self.last, next: None, data: _data, data2: _data2})));
   if (self.last == None)
     {
   if (self.head != None || self.count != 0) throw;
   self.head = self.last = index;
   self.count = 1;
     }
   else
     {
   self.items[self.last - 1].next = index;
   self.last = index;
   self.count++;
     }
 }

 function get_head_data(data storage self) returns (bytes32,bytes32) {
   var it = iterate_start(self);
   return (iterate_get(self, it));
 }

 function get_head_iterate(data storage self) returns (uint80) {
   var it = iterate_start(self);    
   return it;
 }

 // Interface of Iterator
 function iterate_start(data storage self) returns (uint80) { return self.head; }
 function iterate_next(data storage self, uint80 _index) returns (uint80) { return self.items[_index - 1].next; }
 function iterate_get(data storage self, uint80 _index) returns (bytes32, bytes32) {
   return (self.items[_index - 1].data, self.items[_index - 1].data2); }
}

contract Link {
 using LinkedList for LinkedList.data;
 LinkedList.data public list;
 function Test() {
   list.append("abc","111");
   list.append("def", "222");
   list.append("ghf", "333");
 }

 function get() returns (bytes32, bytes32) {
   return (list.get_head_data());
 }
}

你想用

連結.call.get()

此外,更好的方法是標記 get 函式常量。然後它會預設呼叫。

這會進行模擬交易呼叫並返回值。否則,您將進行實際交易並獲得返回值。

處理字元串可能很棘手。它們不是值類型,例如bytes32,而是指向動態字節數組的指針,類似於C 中的。有關更多資訊char*,請參閱文件

在 Geth 版本 1.10.12 上,您可以像這樣呼叫 get 方法:

link.get.call()

此外,在 Solidity 中的 get 函式定義中constant包含viewand修飾符,而不是 。public

如果你的函式沒有返回任何值,你可以直接呼叫它而無需像這樣的呼叫方法

myContract.myFunction()

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