He creado una API para agregar candidatos. Pero cuando ejecuto la api me sale el error:
Input byte array must be in range 0 < M <= 32 and length must match type
Mi codenippet para addCandidates es:
@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";
}
El código para el contrato en java es:
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);
}
¿Alguien puede decirme qué estoy haciendo mal aquí? ¿Es getBytes () la forma correcta de convertir una cadena en bytearray? Cualquier pista sería apreciada. ¡¡Gracias!!
Encontré la solución: implementé la siguiente función en mi contrato de solidez:
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))
}
}
Lo usé en la función:
function addCandidate(string candidateName, string election) public {
bytes32 c1 = stringToBytes32(candidateName);
bytes32 e1 = stringToBytes32(election);
candidates[c1] = candidate(c1,e1,0);
}
ismael