В моем файле QueryResultHandler.sol у меня есть три функции: одна для хранения данных (запрос двух идентификаторов в виде целых чисел и двух строковых значений) и две для проверки (путем предоставления целых чисел или строковых значений). QueryResultHandler.js:
pragma solidity ^0.4.4;
contract QueryResultHandler {
struct QueryResultStruct {
bytes32 finalHash;
bytes32 queryHash;
bytes32 resultHash;
uint256 queryId;
uint256 resultId;
}
QueryResultStruct[] queryResultStructArray;
function storeQueryResults(uint256 _queryId, uint256 _resultId, string _queryString, string _resultString) external returns (bool success) {
bytes32 queryHash = keccak256(_queryString);
bytes32 resultHash = keccak256(_resultString);
bytes32 hashThem = keccak256(queryHash, resultHash);
queryResultStructArray.push(QueryResultStruct(hashThem, queryHash, resultHash, _queryId, _resultId));
return true;
}
function validateQueryResultsById(uint256 _queryId, uint256 _resultId) external view returns (bool success) {
for (uint i = 0; i < queryResultStructArray.length; i++){
if (queryResultStructArray[i].queryId == _queryId && queryResultStructArray[i].resultId == _resultId) {
return true;
}
}
return false;
}
function validateQueryResultsByString(string _queryString, string _resultString) external view returns (bool success) {
bytes32 queryHash = keccak256(_queryString);
bytes32 resultHash = keccak256(_resultString);
bytes32 hashThem = keccak256(queryHash, resultHash);
for (uint i = 0; i < queryResultStructArray.length; i++) {
if (queryResultStructArray[i].finalHash == hashThem) {
return true;
}
}
return false;
}
}
Я использую Truffle и хотел написать очень простой модульный тест, который сохраняет некоторые данные, а затем проверяет их. Функция хранилища возвращает true, однако после этого проверка завершается ошибкой. Может кто-нибудь помочь мне, в чем может быть проблема?
'use strict';
var QueryResultHandler = artifacts.require("./QueryResultHandler.sol");
contract('QueryResultHandler', function() {
it("should store 1, 21, a, b and then verify by the ID/string", async () => {
let query = await QueryResultHandler.deployed();
query.storeQueryResults.call(1,21,"a","b").then(function(stored){
console.log(stored);
});
query.validateQueryResultsByString.call("a","b").then(function(valid){
console.log(valid);
});
});
});
Проблема в том, что когда вы используете query.storeQueryResults.call(1,21,"a","b")
для вызова функции. На самом деле вы не меняете состояние контракта; вот как вы вызываете функции чтения (чистые/постоянные/представления)
Что вы хотите сделать, так это изменить свой тест на трюфель с
query.storeQueryResults.call(1,21,"a","b").then(function(stored){
console.log(stored);
});
К
query.storeQueryResults(1,21,"a","b").then(function(stored){
console.log(stored);
});
Заметьте, что сейчас нет .call()
части.
Вторая часть вашего теста вызывает view
функцию, поэтому ее не нужно менять.
Антона