Входной массив байтов должен быть в диапазоне 0 < M <= 32, а длина должна соответствовать type-web3j.

Я создал 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() правильным способом преобразования строки в массив байтов?? Любые выводы будут оценены. Спасибо!!

Ответы (1)

Я нашел решение: я реализовал следующую функцию в своем контракте на солидность:

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

    }
Это решение будет усекать строки размером более 32 байт, а также могут возникнуть проблемы со строками короче 31 байта, если они сжаты.