У меня есть простая функция для сравнения двух строк:
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
Более того, что именно происходит? Любое обходное решение?
Я думаю, что консоль помогает вам, когда вы пытаетесь выполнить команды без правильной обработки промисов. Члены вашего контракта (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