строка и ошибка: новый BigNumber() не число

Я пытаюсь сгенерировать хэш файла и отправить его на контракт. Но я получаю сообщение об ошибке

Ошибка: новый BigNumber() не число: a8fac6cf98e6f5e9a76ae1f8064e505b(…)

Вот мой код контракта:

function sendHash(address student_id, string hash_value) returns(bool sufficient) 
{ 
    student_hashes[student_id] = hash_value;        
    return true; 
}

Вот мой код javascript

function sendHash() {
  getAddresses();
  var meta = MetaCoin.deployed();

  var address = document.getElementById("studentId").value;
  var hash = (document.getElementById("hash").value);
  setStatus("Initiating transaction... (please wait)");

  meta.sendHash(account, hash).then(function() {
    setStatus("Transaction complete!");
  }).catch(function(e) {
    console.log(e);
    setStatus("Error sending contract; see log.");
  });

Я использую тип данных «строка» в контракте, но ошибка говорит, что это не число. Пробовали разные способы, но не смогли это исправить. Любая помощь будет высоко оценен!

Привет. Не могли бы вы рассказать мне больше об объявлении переменной сопоставления student_hashes? Вы используете mapping(address => string) или mapping(address => uint) ?
Привет @gjeanmart я используюmapping (address => string) student_hashes;
Обычно вы хотите хранить хэши в байтах32, поскольку длина фиксирована, а работа со строками переменной длины в Solidity может быть PITA.

Ответы (1)

Я заставил это работать. Я не воспроизвел вашу проблему «Ошибка: новый BigNumber() не число:». Итак, во-первых, я бы рекомендовал повторно развернуть с помощью

truffle migrate --reset

Тогда, пожалуйста, ниже рабочий код:

Договор

pragma solidity ^0.4.4;
contract MetaCoin{
    mapping (address => string) student_hashes;
    function sendHash(address student_id, string hash_value) returns(bool sufficient)  { 
        student_hashes[student_id] = hash_value;        
        return true; 
    }
    function getHash(address student_id) constant returns(string hash)  {       
        return student_hashes[student_id]; 
    }
}

HTML

<!DOCTYPE html>
<html>
<head>
  <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
  <link href="./app.css" rel='stylesheet' type='text/css'>
  <script src="./app.js"></script>
</head>
<body>
  <h1>Issue</h1>

  <br><label for="address">Address:</label><input type="text" id="studentId"></input>
  <h3>Last hash: <span class="black"><span id="lastHash"></span></span></h3>
  <button id="send" onclick="getHash()">get hash</button>

  <br>
  <h1>Send</h1>
  <br><label for="hash">Hash:</label><input type="text" id="hash"></input>
  <br><br><button id="send" onclick="sendHash()">Send hash</button>
  <br><br>
  <span id="status"></span>
</body>
</html>

Javascript

var accounts;
var account;

function setStatus(message) {
  var status = document.getElementById("status");
  status.innerHTML = message;
};
function getHash() {
  var c = MetaCoin.deployed();

  var address = document.getElementById("studentId").value;

  c.getHash.call(address).then(function(value) {
    var h_element = document.getElementById("lastHash");
    h_element.innerHTML = value.valueOf();
  }).catch(function(e) {
    console.log(e);
    setStatus("Error getting Hash; see log.");
  });
};

function sendHash() {
  var c = MetaCoin.deployed();

  var address = document.getElementById("studentId").value;
  var hash = (document.getElementById("hash").value);

  setStatus("Initiating transaction... (please wait)");

  c.sendHash(address, hash).then(function() {
    setStatus("Transaction complete!");
    getHash()
  }).catch(function(e) {
    console.log(e);
    setStatus("Error sending hash; see log.");
  });
};

window.onload = function() {
  web3.eth.getAccounts(function(err, accs) {
    if (err != null) {
      alert("There was an error fetching your accounts.");
      return;
    }

    if (accs.length == 0) {
      alert("Couldn't get any accounts! Make sure your Ethereum client is configured correctly.");
      return;
    }

    accounts = accs;
    account = accounts[0];
  });
}

Только одно замечание: - Когда вы отправляете транзакцию, не забудьте добавить хотя бы {account: %sender address%}