web3.py возврат из функции получения в странном формате - PullRequest
0 голосов
/ 06 августа 2020

Я разрабатываю приложение python. Это приложение предназначено только для получения данных из блокчейна. В web3. js все работает хорошо, но мне нужно сделать это в python (клиент хочет приложение python). Все работает почти хорошо; Сценарий делает то, что ему нужно, но при вызове функции get я получаю странный результат (используя функцию get в remix или web3. js, а nodeJs api, который я написал, работает просто идеально):

D:\pytoh\b_get\Scripts\python.exe C:/Users/Alessandro/PycharmProjects/pytoh/b_get/bget.py
True
[(b'\xe9:=\xd87/\x98\x00\xe4\x89\xe3\x8eb[c\x9cj\xc4\xa3\xa2b\x1d\x9a\xf0%\x1d\xdaB\xb7\xd9\xc4\xe3', 
b'\xe9:=\xd87/\x98\x00\xe4\x89\xe3\x8eb[c\x9cj\xc4\xa3\xa2b\x1d\x9a\xf0%\x1d\xdaB\xb7\xd9\xc4\xe3')]

Process finished with exit code 0
1003 * выходной сигнал, что мне нужно, это так (я не понимаю, почему выход ру, как это): [0xe93a3dd8372f9800e489e38e625b639c6ac4a3a2621d9af0251dda42b7d9c4e3,0xe93a3dd8372f9800e489e38e625b639c6ac4a3a2621d9af0251dda42b7d9c4e3] 1005 * The python сценарий прост (я» м все еще пишу):
import json
from web3 import Web3
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:7545'))
print(w3.isConnected())
with open("ABI.json") as f:
  info_json = json.load(f)
abi = info_json["output"]["abi"]

 address = "0x1305ef6377fe8cB7C6dD7Eb2B6cAD83A34fC7503"
 get = w3.eth.contract(address=address, abi=abi) 
 result=get.functions.getUser("0xe93a3dd8372f9800e489e38e
                       625b639c6ac4a3a2621d9af0251dda42b7d9c4e3").call()
 print(result)

А это смарт-контракт, который написал клиент:

pragma solidity ^0.4.26;
pragma experimental ABIEncoderV2;

contract crud{
  address owner;
  constructor() public{
  owner = msg.sender;
}
modifier onlyOwner () {
   require(msg.sender == owner);
    _;
}
struct user{
    bytes32 hash_json;
    bytes32 hash_corso;
}
 mapping (bytes32 => user[]) public users;

 
 function setUser(bytes32 _hash, bytes32 _hash_json, bytes32 _hash_corso) onlyOwner  public {
     user memory usr;
     usr.hash_json=_hash_json;
     usr.hash_corso= _hash_corso;
     users[_hash].push(usr);
 }
 
 function getUser(bytes32 _hash) view public returns (user[] memory) {
     return users[_hash];
 }

 }

Спасибо за помощь!

1 Ответ

1 голос
/ 06 августа 2020

Результат - байтовый массив. Когда вы распечатываете его, он преобразует управляющие символы в шестнадцатеричный, но печатает читаемые символы.

Чтобы получить полную шестнадцатеричную строку, попробуйте следующее:

result = bytearray([22,32,7,67,14,87,90])  # for testing
hxstr = "".join(["{:02x}".format(v) for v in result])
print("0x"+hxstr)

Вывод

0x162007430e575a
...