44935


ERC20のトークンを発行したいです  
truffle+zeppelinを使用しています

public宣言したものは自動的にアクセッサが作成される理解ですがアクセス出来ません

以下 solidity：

[code]

    pragma solidity ^0.4.23;
    import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
    
    contract myToken is StandardToken {
        string public name = "my token";
        string public symbol = "cr";
        uint public decimals = 18;
        address minter;
        uint private amount;
        mapping (address => uint) public balances;
        uint public totalSupply;
    
[/code]

以下 python：

[code]

    class tkn():
        contract_address = W3.toChecksumAddress(add_0x_prefix('0x...'))
        with open("./myToken.json") as f:
            info_json = json.load(f)
        _abi_ = info_json["abi"]
    
        def __init__(self):
            self.contract_instance = W3.eth.contract(abi=self._abi_, address=self.contract_address)
    
    if __name__ == '__main__':
        tk = tkn()
        contract_instance = tk.contract_instance
        contract_address = tk.contract_address
    
        print("totalSupply:", contract_instance.call().totalSupply())
        print("symbol:", contract_instance.call().symbol())
    
[/code]

結果は

[code]

    totalSupply: 0
    Traceback (most recent call last):
    File "access.py", line 43, in <module>
        print("symbol:", contract_instance.call().symbol())
    File "/usr/local/lib/python3.6/site-packages/web3/contract.py", line 1349, in call_contract_function
        fn_kwargs=kwargs,
    File "/usr/local/lib/python3.6/site-packages/web3/utils/contracts.py", line 202, in prepare_transaction
        fn_kwargs,
    File "/usr/local/lib/python3.6/site-packages/web3/utils/contracts.py", line 218, in encode_transaction_data
        fn_identifier, contract_abi, fn_abi, args, kwargs,
    File "/usr/local/lib/python3.6/site-packages/web3/utils/contracts.py", line 241, in get_function_info
        fn_abi = find_matching_fn_abi(contract_abi, fn_name, args, kwargs)
    File "/usr/local/lib/python3.6/site-packages/web3/utils/contracts.py", line 128, in find_matching_fn_abi
        raise ValidationError(message)
    web3.exceptions.ValidationError: 
    Could not identify the intended function with name `symbol`, positional argument(s) of type `()` and keyword argument(s) of type `{}`.
    Found 0 function(s) with the name `symbol`: []
    Function invocation failed due to improper number of arguments.
    
[/code]

totalSupply,symbolともpublic宣言しているので同じようにアクセス出来ると思うのでうがどこが悪いのでしょうか?  
他のname,decimalsも同様にエラーとなります

web3.pyのバージョンは4.3.0です

truffleのコンソールでは取得可能です

[code]

    > a = myToken.at(myToken.address)
    > a.symbol()
    'cr'
    
[/code]


CC BY-SA 4.0
2018-06-20T09:48:38.573
44915
2019-05-26T05:50:19.367
2019-05-26T05:50:19.367
3060
27721
question
python python3 ethereum solidity
スマートコントラクタ へのアクセス


やはりpythonの仕様が分からないので、怪しいところを指摘するだけとなります。申し訳ありません。

callを利用していますが、例えばコントラクトの関数を呼ぶ場合で、その関数が状態変数を変更しない場合でも、その関数内で読み込んだ状態変数のデータ量が多い場合はgasが掛かるのでsendTransactionで呼ぶ必要がある場合があります。symbolでエラーになっているのはstring型に対してcallしてるからではないでしょうか?  
自分はEventを発火させてそれを取得するとき、文字列はbytes32を利用しました。  
確かstringよりbaytes32の方がbyte数を制限している分データ量が少ないので、公式も文字列を扱う場合はこちらを推奨していたと思います。  
ただStandardTokenのsymbolの宣言はstringなのでそこの変更は出来ません。

totalSupplyはソース全文が無いので何とも言えませんが、宣言時に初期化していないようですね。  
それとuint型はデフォルトでuint256となります。


CC BY-SA 4.0
2018-06-21T02:12:36.653
44935
2018-06-21T02:12:36.653
22827
44915
answer


解決しました

totalSupplyを初期化していないことが原因でした  
指摘ありがとうございます

後から設定する予定だったので変数宣言止まりだったのが尾を引いてしまったようです  
ゼロ設定で他のsymbolやnameの取得が出来ました  
web3.pyの問題なのかもしれません

`call().symbol()`でアクセスして可能でした

型も`uint`と手を抜かず宣言するようにします


CC BY-SA 4.0
2018-06-21T06:21:55.497
44945
2018-06-21T06:21:55.497
27721
44915
answer