Функция транзакции web3.py выдает неизвестную ошибку учетной записи

Я могу использовать библиотеку web3.py и могу развернуть контракт напрямую, используя свой узел в Эфириуме.

Я создал свой код солидности в ремиксе и скопировал abi в консоль etherum, чтобы развернуть код. Я также получил адрес контракта.

Мой код солидности выглядит следующим образом.

pragma solidity ^0.4.0;

//For testing use the below data
//123,"wheat","grade1",50

contract bidding {

struct bid {
    string bidderName;
    uint grainId;
    uint bidAmount;
    uint bidTime;
}

mapping (uint => bid) bidInfos;
uint[] public bidIds;

function addBid(
    uint _bidId,
    string _bidderName, 
    uint _grainId, 
    uint _bidAmount
) public {
    var bid_info = bidInfos[_bidId];
    bid_info.bidderName = _bidderName;
    bid_info.grainId = _grainId;
    bid_info.bidAmount=_bidAmount;
    bid_info.bidTime= now;

    bidIds.push(_bidId) -1;
}

function getallBids() view public returns(uint[]) {
    return bidIds;
}

function getBid(uint _bidId) view public returns (string, uint, uint, uint) {
    return (
        bidInfos[_bidId].bidderName, 
        bidInfos[_bidId].grainId,
        bidInfos[_bidId].bidAmount, 
        bidInfos[_bidId].bidTime
    );
}

function getbidcount() view public returns (uint) {
    return bidIds.length;
}
}

Я развернулся в своей сети etherum и получил адрес, поскольку в моем питоне я использую библиотеку web3.

from web3 import Web3, HTTPProvider, IPCProvider, WebsocketProvider
import json
web3 = Web3(IPCProvider())
bid_abi=json.loads('''[{"constant":false,"inputs":[{"name":"_bidId","type":"uint256"},{"name":"_bidderName","type":"string"},{"name":"_grainId","type":"uint256"},{"name":"_bidAmount","type":"uint256"}],"name":"addBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getallBids","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_bidId","type":"uint256"}],"name":"getBid","outputs":[{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getbidcount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"bidIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]''')

contract_bid=web3.eth.contract(abi=bid_abi,address='0xbcd8ffbb0f8a5410194ab5a3badf46caaa693098')

contract_bid.functions.addBid(10,"xyzz",1234,5600).transact()

Это ошибка, которую я получаю.

  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\WinPython\python-3.5.4.amd64\lib\site-packages\web3\contract.py", line 1064, in transact
**self.kwargs)
  File "D:\WinPython\python-3.5.4.amd64\lib\site-packages\web3\contract.py", line 1341, in transact_with_contract_function
txn_hash = web3.eth.sendTransaction(transact_transaction)
  File "D:\WinPython\python-3.5.4.amd64\lib\site-packages\web3\eth.py", line 244, in sendTransaction
[transaction],
  File "D:\WinPython\python-3.5.4.amd64\lib\site-packages\web3\manager.py", line 106, in request_blocking
raise ValueError(response["error"])
 ValueError: {'code': -32000, 'message': 'unknown account'}

Я также использую web3.personal.unlockAccount. все равно выдает ту же ошибку. С моей учетной записью связана только одна учетная запись. Что я делаю не так?

как сделать транзакцию, чтобы я мог добавить новую ставку из web3 в python и получить хэш транзакции.

Ответы (1)

Две вещи: убедитесь, что контрольная сумма адресов верна. ты можешь сделать:

web3.toChecksumAddress('0xbcd8ffbb0f8a5410194ab5a3badf46caaa693098')// для адреса контракта

Кроме того, попробуйте определить fromтранзакцию, например:

contract_bid.functions.addBid(10,"xyzz",1234,5600).transact({'from': 'your_account'})

Надеюсь это поможет.

Обратите внимание, что использование toChecksumAddressстирает любое значение использования контрольной суммы. Если вы копируете/вставляете адрес откуда-то, посмотрите, сможете ли вы найти версию с контрольной суммой из этого источника. Если вы используете источник, который не предоставляет адрес с контрольной суммой, я рекомендую сообщать об этом как об ошибке.
не могли бы вы уточнить это «стирает любое значение использования контрольной суммы»
Если вы запустите toChecksumAddressадрес с ошибочной контрольной суммой (что означает, что адрес введен неправильно), метод просто «исправляет» неверную контрольную сумму. Например, попробуйте: `Web3.toChecksumAddress('0xBCD8fFBb0F8a5410194AB5a3baDF46caaA693098')`.