コントラクトへの送金について
動かないものの最後にpythonのコードを追加します
以下の様にスマートコントラクトを実装しました
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);
}
}
うまくいかないのは、deposit機能です
remixでvalueを入力し、depositを実行することでスマートコントラクトアドレスに送金することはできました
実際はpythonのコードで任意のアカウントからdeposit機能を呼び出して送金したいのですが方法がわかりません
コントラクトアドレス対してはsendTransactionは使えないということまではわかりました
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()
エラーメッセージ
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'
remixからmsgを送っている様にするにはpythonのコードはどのように記載すると良いでしょうか?
callするようにweb3pyのドキュメントにあると思っているのですが分りません