Pasar una variable pública a una función en la consola de trufas

Tengo una función simple para comparar dos cadenas:

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

Esta función funciona correctamente en la consola de trufas si se usa de la siguiente manera:

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

Suponiendo que hemos declarado en el contrato:

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

¿Cuál es la forma correcta de pasar esas cadenas a la llamada? Lo intenté :

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

Además, ¿qué está pasando exactamente? ¿Alguna solución?

Respuestas (1)

Creo que la consola te está ayudando cuando intentas ejecutar los comandos sin manejar las promesas correctamente. Los miembros de su contrato (p, q, r) cuando se llamen con web3 devolverán una promesa, es por eso que todos devuelven verdadero (ya que si solo lo hace t.po t.rdesde la consola devolverá el mismo objeto)

Dicho esto, el último intento es el más cercano, pero la callfunción devuelve una promesa y no se maneja correctamente (pero si intenta hacerlo solo t.q.call()desde la consola, funcionará, igual que t.q(); nuevamente, la consola de trufas podría ayudar a manejar las promesas en sí) ).

Si manejas las promesas correctamente funcionará

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

este regresofalse

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

esto regresarátrue