Probleme beim Senden von Rohtransaktionen zum Aufrufen von Smart-Contract-Methoden?

 let provider_url = 
"https://ropsten.infura.io/v3/d5bca90ec3084aee8abd468fdf876a11";

this.web3Provider = new Web3.providers.HttpProvider(provider_url);
window.web3_ = new Web3(this.web3Provider);

let account = "0x25bA673A96acadD7A02f4c5834Ba80C1AF6b7758";

          let nonce = window.web3_.toHex(window.web3_.eth.getTransactionCount(account));

          let myPrivateKey = "****";

          let privateKey = new Buffer(myPrivateKey, "hex");
          let functionName = "markAttendance";
          let types = ["address", "uint", "uint256"];
          let args = [attendeeAddress, opinion, date];
          let fullName = functionName + "(" + types.join() + ")";
          let signature = CryptoJS.SHA3(fullName, {outputLength: 256}).toString(CryptoJS.enc.Hex).slice(0, 8);
          let dataHex = signature + coder.encodeParams(types, args);
          let data = "0x" + dataHex;
          // let nonce = web3.toHex();
          let gasPrice = window.web3_.toHex(20000000000); // 20 Gwei
          let gasLimitHex = window.web3_.toHex(4700000);

          let rawTx = {
            'nonce': nonce,
            'gasPrice': gasPrice,
            'gasLimit': gasLimitHex,
            'from': account,
            'to': '0xf77c958bdffee94c3f53eb763cffd646cde336d9', 
            'data': data,
            'value': window.web3_.toHex(window.web3_.toWei("0.5", "ether")),
          }
          let tx = new Tx(rawTx);
          tx.sign(privateKey);
          tx.serialize();
          console.log(tx.validate());
          let serializedTx = '0x' + tx.serialize().toString('hex');
          console.log(serializedTx);
window.web3_.eth.sendRawTransaction(serializedTx, function (err, txHash) {
  console.log(err, txHash)
})

Vertrag

contract MarkAttendance {

struct AttendeeDetails {
    address attendance_giver;
    address attendee;
    uint attendance_opinion;
    uint256 timestamp;
    uint256 date_of_attendance;
}

//mapping of structure  for storing the attendeeDetails
mapping(uint => AttendeeDetails) public attendeeDetails;
uint public attendeeDetailsCount;

function markAttendance(address _attendee, uint _attendance_opinion, uint256 _date) public {
    attendeeDetailsCount ++;
    attendeeDetails[attendeeDetailsCount] = AttendeeDetails(msg.sender, _attendee, _attendance_opinion, now, _date);
    }
}

Ich erhalte TXHASH, aber die Transaktion wird jedes Mal abgebrochen. Was könnte das Problem sein, das ich mache? kann mir jemand eine Lösung dafür vorschlagen.

Es funktioniert gut, wenn ich die Methode von der Truffle-Konsole aus aufrufe. Ich erhalte eine erfolgreiche Transaktionsquittung.

Bitte finden Sie den Screenshot

Die Transaktion wurde rückgängig gemacht. Um zu wissen, warum, müssten Sie sich den Code für den Vertrag ansehen.
Funktioniert es, wenn Sie es als normale Transaktion senden? Dh Knoten signieren lassen, anstatt es auf der Clientseite zu signieren? Wenn das funktioniert, kann dies ein nächster Schritt zur Fehlerbehebung sein. Da es ein "Revert" gibt, kann es auch als normale Transaktion fehlschlagen.
Ihr hinterlegtes Vertragskonto rawTxist an: 0x7145dc9549f548bef6bb2916e063cc0404d2e8d9und Ihre eigentliche Vertragsadresse ist 0x7145dc9549f548bEF6BB2916e063CC0404d2E8d8. Es gibt eine geringfügige Änderung im letzten Zeichen 9von 8. verbessere es.
@MaheshRajput Obwohl das sicherlich nach einem Problem aussieht, scheint die Transaktion im Screenshot an die richtige Adresse zu gehen: ropsten.etherscan.io/tx/… .
Ja @smarx, ich stimme dir zu, aber ich bitte Sibabrat nur , diese fragliche Änderung zu korrigieren, damit niemand seine Zeit vergeudet, um einen anderen Fehler durch diesen Code zu finden.
Der private Schlüssel stimmt auch nicht mit der Absenderadresse überein.
@ MaheshRajput Ok, ich habe die Frage korrigiert.
@smarx der vertrag ist ganz einfach Bitte schau nochmal in die frage ich habe den vertragscode hinzugefügt.
@ShamitVerma Ich verwende infura für diese Angelegenheit.
Konto mit Konto wechseln
Hey @sibabrat swain, warum schickst du, 0.5 etherum diese Funktion aufzurufen? das ist nicht nötig, entfernen Sie einfach valueeinen Teil aus rawTx und versuchen Sie es dann.

Antworten (1)

Ihre Berechnung des Funktionsselektors ist falsch. Du verwendest "uint"statt "uint256". (Ersteres ist ein Alias ​​für letzteres, aber letzteres sollte immer verwendet werden, wenn ein Funktionsselektor berechnet wird.)

Ändern Sie diese Zeile:

let types = ["address", "uint", "uint256"];

dazu:

let types = ["address", "uint256", "uint256"];

BEARBEITEN

Sie hängen auch Ether an die Transaktion an, aber die Funktion, die Sie aufrufen, ist nicht payableso, dass sie keinen Ether akzeptiert. Um dies zu beheben, löschen Sie die value: ...Zeile.

Es hat nicht funktioniert. Sogar ich habe im Vertrag die uint in uint256 geändert und erneut bereitgestellt. ropsten.etherscan.io/tx/… funktioniert aber gut mit der Konsole firebasestorage.googleapis.com/v0/b/blockshorts-app.appspot.com/…
Sie müssen auch das Problem beheben, auf das @MaheshRajput hingewiesen hat, nämlich dass Sie Ether anhängen, wenn Sie eine Nicht- payableFunktion aufrufen.