contract Calculator{
int result;
function Calculator(int initialResult){
result=initialResult;
}
}
Si arriba está el código fuente del contrato que he creado, entonces cómo llamar a la función Calculadora usando la API ethereumj. ya he usado
contract.callFunction("Calculator", 10)
Pero esto no funciono. También llamado
contract.callConstFunction("Calculator", 10)
Pero esto tampoco funcionó.
Y cuando vio el ABI, tenía el tipo de función = "constructor", pero no pudo encontrar ningún método que represente llamar al constructor.
Sugiera si hay alguna forma de llamar a las funciones del constructor.
Finalmente encontré una solución. Como se discutió en la otra respuesta, debe analizar y agregar los parámetros de inicio al código del contrato antes de enviar la transacción. En realidad, no encontré una forma elegante y genérica de analizar argumentos directamente en Java (pero no debería ser difícil hacerlo), así que decodifiqué la sintaxis ABI en byte[].
En primer lugar, copie StandaloneBlockchain.java y agregue un método (lo siento, no puedo encontrar una manera fácil de hacerlo a través de la extensión):
public SolidityContract submitNewContract(String soliditySrc, String contractName, byte[] initParameters) {
SolidityContractImpl contract = createContract(soliditySrc, contractName);
submitNewTx(new PendingTx(new byte[0], BigInteger.ZERO, ByteUtil.merge(Hex.decode(contract.getBinary()), initParameters), contract, null));
return contract;
}
Luego, en StandaloneBlockchainSample.java, consulte la clase modificada, modifique el contrato de muestra para tener 2 parámetros en el constructor (no tuve tiempo de verificar todos los tipos, pero debería funcionar sin problemas) y asigne los valores de inicio de los parámetros:
// Pretty simple (and probably the most expensive) Calculator
private static final String contractSrc =
"contract Calculator {" +
" int public result;" + // public field can be accessed by calling 'result' function
" string testString;" +
" bool testBool;"+
" function add(int num) {" +
" result = result + num;" +
" }" +
" function sub(int num) {" +
" result = result - num;" +
" }" +
" function mul(int num) {" +
" result = result * num;" +
" }" +
" function div(int num) {" +
" result = result / num;" +
" }" +
" function clear() {" +
" result = 0;" +
" }" +
" function getString() constant returns (string) { return testString; }" +
" function getBool() constant returns (bool) { return testBool; }" +
" function Calculator(string _testString, bool _testBool){" +
" testString = _testString;" +
" testBool = _testBool;" +
" }" +
"}";
[...]
String parameters = "{ 'inputs': [ { 'name': '_test', 'type': 'string' }, { 'name': '_test2', 'type': 'bool' } ] }".replaceAll("'", "\"");
byte[] initParameters = CallTransaction.Function.fromJsonInterface(parameters).encodeArguments("Test", true);
SolidityContract calc = bc.submitNewContract(contractSrc, null, initParameters);
System.out.println("Calculating...");
Después de eso, verifique el valor correcto de los parámetros con:
assertEqual("Test", (String) calc.callConstFunction("getString")[0]);
assertEqual(true, (boolean) calc.callConstFunction("getBool")[0]);
Tenga en cuenta que debe modificar el método privado assertEqual dentro de la clase para afirmar otros tipos además del BigInteger ya definido. Probé esta solución con EthereumJ 1.2.0: tal vez los próximos lanzamientos incluyan una mejor manera de pasar los valores de inicio al constructor, así que actualice la respuesta si lo sabe.
No necesita llamar al constructor, debe enviar el contrato y automáticamente tendrá un puntero al contrato, de esta manera:
StandaloneBlockchain bc = new StandaloneBlockchain().withAutoblock(true);
bc.createBlock();
SolidityContract contract = bc.submitNewContract(contractSrc);
System.out.println(contract.callConstFunction("result")[0]);
Puede ver un ejemplo de trabajo simple pero completo en github
Agregado a 1.3.0-RC4:
SolidityContract a = sb.submitNewContract(
"contract A {" +
" uint public a;" +
" uint public b;" +
" function A(uint a_, uint b_) {a = a_; b = b_; }" +
"}", 555, 777);
Ajay Bhojak
Giuseppe Bertone
Ajay Bhojak
Giuseppe Bertone
Ajay Bhojak