Solidity

將公共變數傳遞給松露控制台中的函式

  • May 10, 2018

我有一個簡單的函式來比較兩個字元串:

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

如果按以下方式使用,此功能可在 truffle 控制台中正常工作:

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

此外,到底發生了什麼?任何解決方法?

我認為當您嘗試在未正確處理承諾的情況下執行命令時,控制台會為您提供幫助。當使用 web3 呼叫時,您的契約成員 (p, q, r) 將返回一個承諾,這就是所有返回 true 的原因(因為如果您只是這樣做t.pt.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

引用自:https://ethereum.stackexchange.com/questions/48144