43855


動かないものの最後にpythonのコードを追加します

以下の様にスマートコントラクトを実装しました

[code]

    pragma solidity ^0.4.23;
    contract Vote {
        address public sender;
        mapping (address => uint256) public balanceOf;
        uint private amount;
    
        function Vote() {
        }
    
        function deposit() public payable {
            sender = msg.sender;
            amount += msg.value;
        }
    
        function transfer(address _to, uint256 _vt) {
            _to.transfer(_vt);
        }        
    }
    
[/code]

うまくいかないのは、deposit機能です  
remixでvalueを入力し、depositを実行することでスマートコントラクトアドレスに送金することはできました  
実際はpythonのコードで任意のアカウントからdeposit機能を呼び出して送金したいのですが方法がわかりません  
コントラクトアドレス対してはsendTransactionは使えないということまではわかりました

[code]

    from eth_utils import add_0x_prefix
    from web3 import Web3, HTTPProvider
    from web3.contract import ConciseContract
    
    web3 = Web3(HTTPProvider('http://localhost:8545'))
    
    def contract_vote():
        from_account = add_0x_prefix('0xfrom')
        contract_address = add_0x_prefix('0xcontract＿address')
        abi_ = [{'constant': True, 'inputs': [], 'name': 'sender', 'outputs': [{'name': '', 'type': 'address'}], 'payable': False, 'stateMutability': 'view', 'type': 'function'}, {'constant': True, 'inputs': [{'name': '', 'type': 'address'}], 'name': 'balanceOf', 'outputs': [{'name': '', 'type': 'uint256'}], 'payable': False, 'stateMutability': 'view', 'type': 'function'}, {'constant': False, 'inputs': [{'name': '_addr', 'type': 'address'}], 'name': 'chkBalance', 'outputs': [], 'payable': False, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': False, 'inputs': [{'name': '_to', 'type': 'address'}, {'name': '_vt', 'type': 'uint256'}], 'name': 'transfer', 'outputs': [], 'payable': False, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': False, 'inputs': [], 'name': 'deposit', 'outputs': [], 'payable': True, 'stateMutability': 'payable', 'type': 'function'}, {'inputs': [], 'payable': False, 'stateMutability': 'nonpayable', 'type': 'constructor'}]
        contract_instance = web3.eth.contract(abi=abi_, address=contract_address, ContractFactoryClass=ConciseContract)
    
        web3.personal.unlockAccount(from_account, 'pwd')
    
        res_to = contract_instance.functions.deposit().call({'from': from_account, 'to': contract_address, 'value': web3.toWei(1, 'ether')})
    
        web3.personal.lockAccount(from_account)
    
    if __name__ == '__main__':
        contract_vote()
    
[/code]

エラーメッセージ

[code]

    Traceback (most recent call last):
      File "sendtoca.py", line 20, in <module>
        contract_vote()
      File "sendtoca.py", line 15, in contract_vote
        res_to = contract_instance.deposit({'from': from_account, 'to': contract_address, 'value': web3.toWei(1, 'ether')})
      File "/usr/local/lib/python3.6/site-packages/web3/contract.py", line 777, in __call__
        return self.__prepared_function(*args, **kwargs)
      File "/usr/local/lib/python3.6/site-packages/web3/contract.py", line 790, in __prepared_function
        return getattr(self._function(*args), modifier)(modifier_dict)
      File "/usr/local/lib/python3.6/site-packages/web3/contract.py", line 919, in __init__
        self._set_function_info()
      File "/usr/local/lib/python3.6/site-packages/web3/contract.py", line 925, in _set_function_info
        self.kwargs)
      File "/usr/local/lib/python3.6/site-packages/web3/utils/contracts.py", line 100, in find_matching_fn_abi
        raise ValueError("No matching functions found")
    ValueError: No matching functions found
    xxxxxxxx:Etherreum xxxxxx$ python3 sendtoca.py 
    Traceback (most recent call last):
      File "sendtoca.py", line 20, in <module>
        contract_vote()
      File "sendtoca.py", line 15, in contract_vote
        res_to = contract_instance.functions.deposit({'from': from_account, 'to': contract_address, 'value': web3.toWei(1, 'ether')})
    AttributeError: 'ConciseContract' object has no attribute 'functions'
    
[/code]

remixからmsgを送っている様にするにはpythonのコードはどのように記載すると良いでしょうか?  
callするようにweb3pyのドキュメントにあると思っているのですが分りません


CC BY-SA 4.0
2018-04-27T09:01:13.680
43605
2019-05-26T05:49:58.630
2019-05-26T05:49:58.630
3060
27721
question
python ethereum solidity
コントラクトへの送金について


pythonは専門外なのでコードは評価できませんが、アドバイスを。

callはブロックチェーン上で変更が一切無い場合に利用します。etherのやり取りをする限り、callは利用出来ません。必ずsendTransactionを利用する必要があります。コントラクトでpayableの関数を利用するには必ずsendTransactionで呼ぶ必要があります。あなたが上げた例の場合、deposit()はpayableとなっているのでsendTransactionは必須です。因みにpayableとなっていなくともコントラクトの変数を変更する記述がある場合にはsendTransactionで呼ぶ必要があります。

[追記]  
web3.pyをちょっと見てみましたが、ドキュメントによるとトランザクションを送信して関数を実行する場合ContractFunction.transact（トランザクション）を利用するみたいです。  
<http://web3py.readthedocs.io/en/stable/contracts.html#contract-functions>

contract_instance.functions.deposit().transact({'from': from_account, 'to':
contract_address, 'value': web3.toWei(1, 'ether')})


CC BY-SA 4.0
2018-05-08T03:27:40.983
43855
2018-05-08T06:02:24.843
2018-05-08T06:02:24.843
22827
22827
43605
answer


いただいたアドバイスを元に解決できました

一通り記載します

ありがとうございました

[code]

    pragma solidity ^0.4.23;
    contract Vote {
        address public sender;
        mapping (address => uint256) public balanceOf;
        uint private amount;
    
        function Vote() {
    
        }
    
        function() public payable {
            sender = msg.sender;
            amount += msg.value;
        }
    
        function deposit() public payable {
            sender = msg.sender;
            amount += msg.value;
        }
    
        function transfer(address _to, uint256 _vt) public {
            _to.transfer(_vt);
        }
    
        function chkBalance(address _addr) {
            balanceOf[_addr] = _addr.balance;
        }
    }
    
[/code]

フォールバック関数を使用するということでした

[code]

    from eth_utils import add_0x_prefix
    from web3 import Web3, HTTPProvider
    from web3.contract import ConciseContract
    from web3.contract import Contract
    
    w3 = Web3(HTTPProvider('http://localhost:8545'))
    
    def contract_vote():
        from_account = add_0x_prefix('0xfrom')
        contract_address = add_0x_prefix('0xcontract_address')
        abi_ = [{'constant': True, 'inputs': [], 'name': 'sender', 'outputs': [{'name': '', 'type': 'address'}], 'payable': False, 'stateMutability': 'view', 'type': 'function'}, {'constant': True, 'inputs': [{'name': '', 'type': 'address'}], 'name': 'balanceOf', 'outputs': [{'name': '', 'type': 'uint256'}], 'payable': False, 'stateMutability': 'view', 'type': 'function'}, {'constant': False, 'inputs': [{'name': '_addr', 'type': 'address'}], 'name': 'chkBalance', 'outputs': [], 'payable': False, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': False, 'inputs': [{'name': '_to', 'type': 'address'}, {'name': '_vt', 'type': 'uint256'}], 'name': 'transfer', 'outputs': [], 'payable': False, 'stateMutability': 'nonpayable', 'type': 'function'}, {'constant': False, 'inputs': [], 'name': 'deposit', 'outputs': [], 'payable': True, 'stateMutability': 'payable', 'type': 'function'}, {'inputs': [], 'payable': False, 'stateMutability': 'nonpayable', 'type': 'constructor'}, {'payable': True, 'stateMutability': 'payable', 'type': 'fallback'}]
        contract_instance = w3.eth.contract(abi=abi_, address=contract_address, ContractFactoryClass=ConciseContract)
    
        w3.personal.unlockAccount(from_account, 'pwd')
    
        res_to = w3.eth.sendTransaction({'from': from_account, 'to': contract_address, 'value': w3.toWei(1, 'ether')})
    
        w3.personal.lockAccount(from_account)
    
    if __name__ == '__main__':
        contract_vote()
    
[/code]


CC BY-SA 4.0
2018-05-11T08:34:51.967
43916
2018-05-11T08:34:51.967
27721
43605
answer