Übergeben einer öffentlichen Variable an eine Funktion in der Truffle-Konsole

Ich habe eine einfache Funktion, um zwei Zeichenfolgen zu vergleichen:

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;
}

Diese Funktion funktioniert ordnungsgemäß in der Truffle-Konsole, wenn sie wie folgt verwendet wird:

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

Angenommen, wir haben im Vertrag erklärt:

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

Was ist der richtige Weg, um diese Zeichenfolge an den Aufruf zu übergeben? Ich habe es versucht :

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

Außerdem, was ist eigentlich los? Irgendeine Problemumgehung?

Antworten (1)

Ich denke, die Konsole hilft Ihnen, wenn Sie versuchen, die Befehle auszuführen, ohne die Versprechungen korrekt zu handhaben. Ihre Vertragsmitglieder (p, q, r) geben beim Aufruf mit web3 ein Versprechen zurück, weshalb alle Rückgaben wahr sind (denn wenn Sie es einfach tun t.poder t.rvon der Konsole aus dasselbe Objekt zurückgeben).

Der letzte Versuch ist also der naheliegendste, aber die callFunktion gibt ein Versprechen zurück und wird nicht korrekt behandelt (aber wenn Sie versuchen, dies nur t.q.call()von der Konsole aus zu tun, wird es funktionieren, genauso wie t.q(); Auch hier könnte die Truffle-Konsole beim Umgang mit den Versprechen selbst helfen ).

Wenn Sie die Versprechen richtig handhaben, wird es funktionieren

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

diese Rückkehrfalse

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

das wird wiederkommentrue