atom-ethereum-interface, возвращающий разные результаты из браузера-солидности

Я работаю над концептуальным децентрализованным приложением «почтовый сервер» и получаю различное поведение в интерфейсе атома-эфириума и в браузере-солидности .

Я запускаю частную цепочку блоков в контейнере Docker с моими собственными узлами, успешно обрабатывающими все мои транзакции.

Вот мой код прочности:

// EmailServer.sol

pragma solidity ^0.4.2;

contract EmailServer {
  address owner;
  bytes[] inbox;

  function EmailServer() {
    owner = msg.sender;
  }

  function addEmail(bytes x) constant {
    inbox.push(x);
  }

  function getInboxCount() returns (uint count) {
    return inbox.length;
  }

  function getEmails() returns (bytes email) {
    bytes emailsOutput;
    uint inboxCount = getInboxCount();
    uint emailLength;

    if (inboxCount == 0) {
      throw;
    }

    emailsOutput.push('[');
    for (uint i = 0; i < inboxCount; i++) {
      emailLength = inbox[i].length;
      emailsOutput.push('"');
      for (uint j = 0; j < emailLength; j++) {
        emailsOutput.push(inbox[i][j]);
      }
      emailsOutput.push('"');

      if (i < inboxCount - 1) {
        emailsOutput.push(',');
      }
    }
    emailsOutput.push(']');

    return emailsOutput;
  }

  function getOwner() returns (address) {
    return owner;
  }

  // Kill contract and return funds to owner
  function kill() {
    if (msg.sender == owner) {
      suicide(owner);
    }
  }
}

Этот контракт корректно компилируется и развертывается как в интерфейсе атома-эфириума, так и в браузере-солидности.

В обоих местах можно запускать addEmail("QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN")и работает нормально.

Но затем в браузере-солидности при запуске getInboxCount()вы получаете resultof: 0x0000000000000000000000000000000000000000000000000000000000000001который декодируется в a uintof 1.

Когда вы запускаете getInboxCount()интерфейс atom-ethereum-interface, каждый раз, когда вы запускаете функцию , contract outputона меняется. 0xab979d45598f6f3a548113f896a8d24681e9d231a5e3d614cae4b0dcee19e578Кажется, он ничего не расшифровывает.

Так же и с любой другой функцией. В браузерной солидности он, кажется, работает нормально, но в интерфейсе атома-эфириума он возвращает что-то, что я не могу декодировать во что-то значимое.

Ответы (1)

Вам нужно использовать constantярлык:

function getInboxCount() constant returns (uint count) {
    return inbox.length;
}

Без него web3.js/atom-ethereum-interface дает вам хэш транзакции, например, чтение uint из сопоставления продолжает возвращать случайный адрес

Без constant, getInboxCountвызов с помощью web3.js sendTransactionвсегда возвращает хэш транзакции. См. В чем разница между транзакцией и вызовом?

Спасибо, это очень помогает и исправило пару методов. Метод, который он не исправляет, заключается в том , getEmails()что он проходит через bytes[], проходит через каждую bytesи декодирует каждую букву, чтобы вернуть сериализованный массив. Это ошибка с Uncaught BigNumber Error: new BigNumber() not a base 16 number. Я уверен, что есть лучший способ вернуть массив?
Возврат массива и ошибку при возврате байтов лучше всего задавать как два отдельных вопроса. Кроме того, попробуйте более простую функцию, которая возвращает bytes.