web3.py-Transaktionsfunktion mit unbekanntem Kontofehler

Ich kann die web3.py-Bibliothek verwenden und den Vertrag direkt über meinen Knoten in Ethereum bereitstellen.

Ich habe meinen Solidity-Code in Remix erstellt und das abi in die Etherum-Konsole kopiert, um den Code bereitzustellen. Ich habe auch die Adresse des Vertrages.

Mein Soliditätscode lautet wie folgt.

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;
}
}

Ich habe in meinem Etherum-Netzwerk bereitgestellt und die Adresse als erhalten. In meiner Python verwende ich die web3-Bibliothek.

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()

Dies ist der Fehler, den ich bekomme.

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

Ich mache auch einen web3.personal.unlockAccount. es gibt immer noch denselben Fehler. Es gibt auch nur ein Konto, das mit meinem Konto verknüpft ist. Was mache ich falsch?

wie man die Transaktion durchführt, damit ich ein neues Gebot von web3 in Python hinzufügen und den Transaktionshash erhalten kann.

Antworten (1)

Zwei Dinge: Achten Sie darauf, dass die Prüfsumme der Adressen stimmt. du kannst tun:

web3.toChecksumAddress('0xbcd8ffbb0f8a5410194ab5a3badf46caaa693098')// für die Vertragsadresse

Versuchen Sie auch, die fromIn-Transaktion wie folgt zu definieren:

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

Hoffe das hilft.

Beachten Sie, dass using toChecksumAddressjeden Wert der Verwendung der Prüfsumme zunichte macht. Wenn Sie eine Adresse von irgendwoher kopieren/einfügen, sehen Sie nach, ob Sie eine Prüfsummenversion aus dieser Quelle finden können. Wenn Sie eine Quelle verwenden, die keine Prüfsummenadresse bereitstellt, empfehle ich, dies als Fehler zu melden.
könnten Sie näher darauf eingehen "löscht jeden Wert der Verwendung der Prüfsumme"
Wenn Sie toChecksumAddresseine Adresse mit einer kaputten Prüfsumme ausführen (was bedeutet, dass die Adresse falsch eingegeben wurde), "repariert" die Methode einfach die kaputte Prüfsumme. Versuchen Sie zum Beispiel: ` Web3.toChecksumAddress('0xBCD8fFBb0F8a5410194AB5a3baDF46caaA693098')`.