コントラクトへの送金について


動かないものの最後に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のドキュメントにあると思っているのですが分りません




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')})




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')})

