Передача общедоступной переменной функции в консоли трюфеля

У меня есть простая функция для сравнения двух строк:

function stringCmp(string a, string b) public returns (bool){ 
  bytes memory aa=bytes(a);
  bytes memory bb=bytes(b);
  if(aa.length!=bb.length)
    return false;
  for(uint i=0; i< aa.length; i++)
    if(aa[i]!=bb[i])
      return false;
  return true;
}

Эта функция правильно работает в консоли трюфеля, если используется следующим образом:

t=contract_name.at("address_of_c");
t.stringCmp.call("string1","string1") --> true
t.stringCmp.call("string1","string2") --> false

Предположим, мы заявили в контракте:

string public p="ciao";
string public q="ciao";
string public r="hello";

Как правильно передать эту строку вызову? Я пытался :

t=contract_name.at("address_of_c");
t.stringCmp.call(t.p(),t.q()) --> true (and it seems ok but..)
t.stringCmp.call(t.p(),t.r()) --> true (So what..???)
t.stringCmp.call(t.p,t.r) --> true (???)
t.stringCmp.call(t.p.call(),t.q.call()) --> Invalid number of arguments to Solidity function

Более того, что именно происходит? Любое обходное решение?

Ответы (1)

Я думаю, что консоль помогает вам, когда вы пытаетесь выполнить команды без правильной обработки промисов. Члены вашего контракта (p, q, r) при вызове с помощью web3 вернут обещание, поэтому все возвращает true (поскольку, если вы просто сделаете это t.pили t.rиз консоли, он вернет тот же объект)

Таким образом, последняя попытка является наиболее близкой, но callфункция возвращает обещание и не обрабатывается правильно (но если вы попытаетесь сделать это только t.q.call()из консоли, она будет работать так же, как t.q(); опять же, консоль трюфеля может помочь обработать сами обещания ).

Если вы правильно обрабатываете промисы, это сработает

t.r.call().then((r1) => t.q.call().then((q1) => t.stringCmp(q1, r1).then(console.log)))

это возвращениеfalse

t.p.call().then((p1) => t.q.call().then((q1) => t.stringCmp(q1, p1).then(console.log)))

это вернетсяtrue