Проблемы при отправке необработанной транзакции для вызова методов смарт-контракта?

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

Договор

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

Я получаю TXHASH, но транзакция каждый раз отменяется. в чем может быть проблема, которую я делаю? может ли кто-нибудь предложить мне какое-либо решение для этого.

Он отлично работает, если я вызываю метод из консоли трюфеля. Я получаю квитанцию ​​об успешной транзакции.

Пожалуйста, найдите скриншот

Транзакция была отменена. Чтобы узнать почему, вам нужно посмотреть на код контракта.
Это работает, если вы отправляете его как обычную транзакцию? Т.е. позволить узлу подписать его вместо того, чтобы подписывать его на стороне клиента? Если это сработает, это может стать следующим шагом для устранения неполадок. Поскольку существует «возврат», он также может завершиться ошибкой как обычная транзакция.
Вы предоставили договорную учетную запись по rawTxадресу: 0x7145dc9549f548bef6bb2916e063cc0404d2e8d9и ваш фактический договорной адрес — 0x7145dc9549f548bEF6BB2916e063CC0404d2E8d8. есть небольшое изменение в последнем символе 9по сравнению с 8. исправь это.
@MaheshRajput Хотя это, безусловно, выглядит как проблема, транзакция на скриншоте, похоже, идет по правильному адресу: ropsten.etherscan.io/tx/… .
Да, @smarx, я согласен с вами, но я просто прошу sibabrat исправить это изменение, о котором идет речь, чтобы никто не тратил свое время на поиск другой ошибки по этому коду.
Закрытый ключ также не соответствует адресу отправителя.
@MaheshRajput Хорошо, я исправил вопрос.
@smarx контракт очень прост Пожалуйста, изучите вопрос еще раз, я добавил код контракта.
@ShamitVerma Для этого я использую инфуру.
изменить с учетной записи на учетную запись
Эй, @sibabrat swain, почему ты посылаешь 0.5 etherвызов этой функции? не нужно, просто удалите valueчасть из rawTx, а затем попробуйте.

Ответы (1)

Ваш расчет селектора функций неверен. Вы используете "uint"вместо "uint256". (Первый является псевдонимом для второго, но последний всегда следует использовать при вычислении селектора функций.)

Измените эту строку:

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

к этому:

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

РЕДАКТИРОВАТЬ

Вы также присоединяете эфир к транзакции, но функция, которую вы вызываете, не payableпринимает эфир. Чтобы это исправить, сбросьте value: ...строку.

Это не сработало. Даже я изменил uint на uint256 в контракте и развернул еще раз. ropsten.etherscan.io/tx/… но отлично работает с консолью firebasestorage.googleapis.com/v0/b/blockshorts-app.appspot.com/…
Вам также необходимо исправить проблему, указанную @MaheshRajput, которая заключается в том, что вы подключаете эфир при вызове не- payableфункции.