Как получить доступ к функции смарт-контракта, защищенной правами доступа, с помощью Web3? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть умный адрес договора для токенов безопасности, и некоторые его функции защищены правами доступа, для которых у меня есть адрес для доступа к этим функциям, однако я не могу выяснить, как вызвать эту функцию с помощьюуказание прав.

from web3 import HTTPProvider, Web3, exceptions

w3 = Web3(HTTPProvider('https://ropsten.infura.io/RPw9nHRS7Ue47RaKVvHM'))
contract_address = '0x635209612bf0e830ac348ef30357ee4f0e5bf560'
provider_abi =  [{"anonymous":False,"inputs":[{"indexed":False,"name":"addr","type":"address"},{"indexed":False,"name":"propertyKey","type":"bytes32"},{"indexed":False,"name":"propertyValue","type":"bytes32"}],"name":"PropertySet","type":"event"},{"constant":False,"inputs":[{"name":"_addr","type":"address"},{"name":"_propertyKey","type":"bytes32"},{"name":"_propertyValue","type":"bytes32"}],"name":"setProperty","outputs":[{"name":"","type":"bool"}],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[{"name":"_addr","type":"address"},{"name":"_propertyKey","type":"bytes32"}],"name":"getProperty","outputs":[{"name":"","type":"bytes32"}],"payable":False,"stateMutability":"view","type":"function"}]

instance = w3.eth.contract(
    address=Web3.toChecksumAddress(contract_address),
    abi = provider_abi
)
user_address = "0x25BEADE120E501D7b984498D196eFe4AbE6a11F6"
country_key = "country"
country_byte_32 = Web3.toHex(Web3.toBytes(text=country_key))
print(country_byte_32) # Prints 0x636f756e747279
country_val = "IN"
country_val_byte_32 = Web3.toHex(Web3.toBytes(text=country_val))
print(country_val_byte_32) # Prints 0x494e
try:
    result = instance.call().setProperty(user_address,country_byte_32,country_val_byte_32)
    print(result) # Prints False
except exceptions.MismatchedABI as ve :
    print(ve)
    import traceback
    print(traceback.format_exc())

Может кто-нибудь подсказать, как мне предоставить адрес права доступа?

1 Ответ

0 голосов
/ 23 апреля 2019

Чтобы поместить значение в поле формы, вы можете сделать это следующим образом

result = instance.call({"from": user_address }).setProperty(user_address,country_byte_32,country_val_byte_32)
...