Solidity
將公共變數傳遞給松露控制台中的函式
我有一個簡單的函式來比較兩個字元串:
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.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