return (bytes32,bytes32) ,返回實際交易地址而不是真實數據
我附上了我的契約,它在 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
包含view
and修飾符,而不是 。public
如果你的函式沒有返回任何值,你可以直接呼叫它而無需像這樣的呼叫方法
myContract.myFunction()