Набор контрактных функций дает ожидаемое поведение при тестировании на 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, который указывает, что значения не были отражены в сопоставлениях в блокчейне, и я не могу понять, почему. Нужна помощь Срочно!!!!!
Похоже, вы пренебрегаете ожиданием завершения транзакции добавления продукта. Затем вы идете вперед, проверяете и обнаруживаете, что ничего не изменилось.
За пределами Remix, который делает это «бесплатно», вам нужно дождаться добытой транзакции, чтобы увидеть эффект.
Приведенная ниже функция позволяет передать квитанцию о транзакции (которая у вас будет) и сделать паузу до тех пор, пока интересующая транзакция не будет добыта.
https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
Надеюсь, поможет.
Функция addproduct() не отражает изменений в цепочке блоков, поскольку она могла быть вызвана с помощью .call() , а вызов — это локальный вызов функции контракта, которая ничего не транслирует и не публикует в цепочке блоков.
Для отражения изменений в блокчейне его следует вызывать с помощью .sendTransaction() , потому что транзакция транслируется в сеть, обрабатывается майнерами и, если она действительна, публикуется в блокчейне.
Перейдите по следующей ссылке для получения дополнительной информации о разнице между транзакцией и вызовом.
Шаран Раджани
Роб Хитченс