Я создал API для добавления кандидатов. Но когда я запускаю API, я получаю ошибку:
Input byte array must be in range 0 < M <= 32 and length must match type
Мой фрагмент кода для addCandidates:
@RequestMapping("/addCandidate")
public String addCandidateDetails(@RequestParam("candidateName") String candidateName, @RequestParam("elecName") String elecName) {
try{
String contractAddress = contract.getContractAddress();
System.out.println(contractAddress);
contract.addCandidate(candidateName.getBytes(), elecName.getBytes());
}
catch (Exception e) {
String error = e.getMessage();
return error;
}
return "Success";
}
Код для контракта в java:
public RemoteCall<TransactionReceipt> addCandidate(byte[] candidateName, byte[] election) {
final Function function = new Function(
FUNC_ADDCANDIDATE,
Arrays.<Type>asList(new org.web3j.abi.datatypes.generated.Bytes32(candidateName),
new org.web3j.abi.datatypes.generated.Bytes32(election)),
Collections.<TypeReference<?>>emptyList());
return executeRemoteCallTransaction(function);
}
Может ли кто-нибудь сказать мне, что я делаю неправильно здесь ?? Является ли getBytes() правильным способом преобразования строки в массив байтов?? Любые выводы будут оценены. Спасибо!!
Я нашел решение: я реализовал следующую функцию в своем контракте на солидность:
function stringToBytes32(string memory source) public returns (bytes32 result) {
bytes memory tempEmptyStringTest = bytes(source);
if (tempEmptyStringTest.length == 0) {
return 0x0;
}
assembly {
result := mload(add(source, 32))
}
}
Использовал его в функции:
function addCandidate(string candidateName, string election) public {
bytes32 c1 = stringToBytes32(candidateName);
bytes32 e1 = stringToBytes32(election);
candidates[c1] = candidate(c1,e1,0);
}
Исмаэль