La matriz de bytes de entrada debe estar en el rango 0 < M <= 32 y la longitud debe coincidir con type-web3j

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!!

Respuestas (1)

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);

    }
Esa solución truncará cadenas de más de 32 bytes, también podría tener problemas con cadenas de menos de 31 bytes si están comprimidas.