Contract Api¶
ContractApi는 java interface로 contract call을 할 수 있는 기능을 제공합니다. 실행 할 때 ContractApi는 자동으로 nonce를 채워줍니다. nonce에러로 실패할 경우 올바른 nonce를 조회한 후 그 nonce로 재시도합니다.
Prepare¶
ContractApi를 사용하기 위해서, 우선 smart contract를 배포해야 합니다. 그 후 smart contract의 함수에 해당하는 interface를 작성하면 됩니다.
smart contract를 작성합니다. 작성 방법에 대해 더 자세히 알고 싶으시면 다음의 문서를 참고하시면 됩니다 Programming Guide.
function constructor(key, arg1, arg2)
if key ~= nil then
system.setItem(key, {intVal=arg1, stringVal=arg2})
end
end
function set(key, arg1, arg2)
contract.event("set", key, arg1, arg2)
system.setItem(key, {intVal=arg1, stringVal=arg2})
end
function get(key)
return system.getItem(key)
end
function check_delegation()
return true
end
abi.register_view(get)
abi.register(set)
abi.fee_delegation(set)
abi.payable(set)
smart contract를 배포합니다.
// make a contract definition
String encodedContract = contractPayload;
ContractDefinition contractDefinition = ContractDefinition.newBuilder()
.encodedContract(encodedContract)
.build();
// deploy contract
walletApi.unlock(authentication);
TxHash txHash = walletApi.with(client).transaction()
.deploy(contractDefinition, Fee.INFINITY);
walletApi.lock();
// sleep
Thread.sleep(2000L);
// get ContractTxReceipt
ContractTxReceipt contractTxReceipt = walletApi.with(client).query()
.getContractTxReceipt(txHash);
// get contract address
ContractAddress contractAddress = contractTxReceipt.getContractAddress();
System.out.println("Deployed contract address: " + contractPayload);
interface를 작성합니다. method 이름은 smart contract의 함수와 일치해야 합니다.
// interface for smart contract
interface CustomInterface1 {
/*
Matches with
function set(key, arg1, arg2)
...
end
...
abi.register(set)
And it also uses provided fee when making transaction.
*/
TxHash set(String key, int arg1, String args2, Fee fee);
/*
Matches with
function set(key, arg1, arg2)
...
end
...
abi.register(set)
And it also uses Fee.INFINITY when making transaction.
*/
TxHash set(String key, int arg1, String args2);
/*
Matches with
function get(key)
...
-- returns lua table which can be binded with Data class
return someVal
end
...
abi.register_view(get)
*/
Data get(String key);
}
// java bean
class Data {
protected int intVal;
protected String stringVal;
public int getIntVal() {
return intVal;
}
public void setIntVal(int intVal) {
this.intVal = intVal;
}
public String getStringVal() {
return stringVal;
}
public void setStringVal(String stringVal) {
this.stringVal = stringVal;
}
@Override
public String toString() {
return "Data{" +
"intVal=" + intVal +
", stringVal=" + stringVal +
'}';
}
}
Make¶
배포된 smart contract와 해당되는 interface를 사용하면 ContractApi를 만들 수 있습니다.
nonce 실패 시 재시도 횟수와 간격을 명시적으로 설정해서 생성.
// create a contract api
ContractAddress contractAddress = deployedContractAddress;
ContractApi<CustomInterface1> contractApi = new ContractApiFactory()
.create(contractAddress, CustomInterface1.class);
System.out.println("ContractApi: " + contractApi);
nonce 실패 시 재시도 횟수와 간격을 기본 설정으로 해서 생성.
// create a contract api with retry count 5 and interval 1000ms
ContractAddress contractAddress = deployedContractAddress;
TryCountAndInterval tryCountAndInterval = TryCountAndInterval.of(5, Time.of(1000L));
ContractApi<CustomInterface1> contractApi = new ContractApiFactory()
.create(contractAddress, CustomInterface1.class, tryCountAndInterval);
System.out.println("ContractApi: " + contractApi);
Execute¶
AergoKey를 사용해서 실행.
// prepare an signer
AergoKey signer = richKey;
// create a contract api
ContractAddress contractAddress = deployedContractAddress;
ContractApi<CustomInterface1> contractApi = new ContractApiFactory()
.create(contractAddress, CustomInterface1.class);
// execute contract with a contract api
TxHash executeTxHash = contractApi.with(client).execution(signer)
.set("key", 123, "test", Fee.INFINITY);
System.out.println("Execute tx hash: " + executeTxHash);
WalletApi를 사용해서 실행.
// create a contract api
ContractAddress contractAddress = deployedContractAddress;
ContractApi<CustomInterface1> contractApi = new ContractApiFactory()
.create(contractAddress, CustomInterface1.class);
// execute contract with a contract api
walletApi.unlock(authentication);
TxHash executeTxHash = contractApi.with(client).execution(walletApi)
.set("key", 123, "test", Fee.INFINITY);
walletApi.lock();
System.out.println("Execute tx hash: " + executeTxHash);
Query¶
Binging할 model을 사용해서 실행.
// create a contract api
ContractAddress contractAddress = deployedContractAddress;
ContractApi<CustomInterface1> contractApi = new ContractApiFactory()
.create(contractAddress, CustomInterface1.class);
// query contract with a contract api
Data data = contractApi.with(client).query().get("key");
System.out.println("Queried data: " + data);
Binging할 model을 사용하지 않고 실행.
// create a contract api
ContractAddress contractAddress = deployedContractAddress;
ContractApi<CustomInterface2> contractApi = new ContractApiFactory()
.create(contractAddress, CustomInterface2.class);
// query contract with a contract api
ContractResult contractResult = contractApi.with(client).query().get("key");
System.out.println("Queried data: " + contractResult);