После развертывания взаимодействие с функциями, не дающими желаемого результата, с использованием Web3, Truffle

Набор контрактных функций дает ожидаемое поведение при тестировании на Remix. Но когда одни и те же функции развернуты на TestRPC с использованием Truffle и Web3 и доступны через веб-интерфейс, это не дает требуемого логического вывода.

Структуры следующие:

struct ProofEntry {
bytes32 owner;
bytes32 privateKey;
bytes32 previousTrackingId;}


struct registerEntry{
bytes32 owner;
bytes32 privateKey;}

Требуемые сопоставления следующие:

mapping (bytes32 => ProofEntry) proofs; // trackingId to ownerBlock

mapping (string => bytes32) items;  // productId to trackingId

mapping (bytes32 => registerEntry) register; // ownerHash to registerEntry

Обратите внимание на следующие функции: 1] addProduct

function addProduct(string password, string productId) public returns(bool){
    if(hasEntry(productId))
      return false;
    else {
    bytes32 owner = keccak256(bytes32ToString(keccak256(password)));
    bytes32 privateKey =  keccak256(password);
    bytes32 previousTrackingId = keccak256("root");
    bytes32 trackingId = keccak256(productId);
    proofs[trackingId] = ProofEntry(owner, privateKey, previousTrackingId);
    register[owner] = registerEntry(owner , privateKey);
    items[productId] = trackingId;
    productAdded(password,owner,productId);
    return true;
  }
}

2] получитьвладельца

function getOwner(string productId) constant returns(bytes32) {
 bytes32 trackingId = items[productId];
 ProofEntry memory record = proofs[trackingId];
 return (record.owner);}

Теперь, когда я тестирую эти функции в Remix, т.е. задавая пароль и идентификатор продукта для addproduct() и задавая идентификатор продукта в getOwner, я получаю соответствующий хэш владельца.

Но когда я развертываю его на testRPC с помощью Truffle, Web3 и получаю к нему доступ с помощью WebUI, addproduct() возвращает true, указывая, что он добавил продукт, но когда я передаю тот же productId в getOwner(), он возвращает значение по умолчанию bytes32, а не OwnerHash, который указывает, что значения не были отражены в сопоставлениях в блокчейне, и я не могу понять, почему. Нужна помощь Срочно!!!!!

Ответы (2)

Похоже, вы пренебрегаете ожиданием завершения транзакции добавления продукта. Затем вы идете вперед, проверяете и обнаруживаете, что ничего не изменилось.

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

Приведенная ниже функция позволяет передать квитанцию ​​о транзакции (которая у вас будет) и сделать паузу до тех пор, пока интересующая транзакция не будет добыта.

https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6

Надеюсь, поможет.

Сколько времени обычно требуется для майнинга транзакции на testRPC? Я долго ждал, также в моем терминале, где работает testRPC, он показывает детали использования газа, номер блока и т. д.
TestRPC более или менее немедленный, поэтому, если событие не приходит, скорее всего, контракт не сгенерировал его.

Функция addproduct() не отражает изменений в цепочке блоков, поскольку она могла быть вызвана с помощью .call() , а вызов — это локальный вызов функции контракта, которая ничего не транслирует и не публикует в цепочке блоков.

Для отражения изменений в блокчейне его следует вызывать с помощью .sendTransaction() , потому что транзакция транслируется в сеть, обрабатывается майнерами и, если она действительна, публикуется в блокчейне.

Перейдите по следующей ссылке для получения дополнительной информации о разнице между транзакцией и вызовом.

В чем разница между транзакцией и звонком?