Я работаю над концептуальным децентрализованным приложением «почтовый сервер» и получаю различное поведение в интерфейсе атома-эфириума и в браузере-солидности .
Я запускаю частную цепочку блоков в контейнере 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()
вы получаете result
of: 0x0000000000000000000000000000000000000000000000000000000000000001
который декодируется в a uint
of 1
.
Когда вы запускаете getInboxCount()
интерфейс atom-ethereum-interface, каждый раз, когда вы запускаете функцию , contract output
она меняется. 0xab979d45598f6f3a548113f896a8d24681e9d231a5e3d614cae4b0dcee19e578
Кажется, он ничего не расшифровывает.
Так же и с любой другой функцией. В браузерной солидности он, кажется, работает нормально, но в интерфейсе атома-эфириума он возвращает что-то, что я не могу декодировать во что-то значимое.
Вам нужно использовать 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
.