Go-Ethereum iOS не может разархивировать результаты

Итак, я играю с go-ethereum в iOS, и у меня довольно много проблем с попыткой взаимодействовать с контрактом, развернутым в тестовой сети Rinkeby, я очень новичок во всей технологии блокчейна, поэтому любая помощь приветствуется.

Все, что я пытаюсь сделать, это получить доступ к развернутому контракту и получить значение строки, но проблема, с которой я сталкиваюсь, заключается в том, что я получаю эту ошибку, когда пытаюсь сделать вызов связанного контракта:

Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=go Code=1 "abi: cannot unmarshal string in to []interface {}" UserInfo={NSLocalizedDescription=abi: cannot unmarshal string in to []interface {}}

это код, который я использую для вызова.

    // Declare the error variables
    var clientError: NSErrorPointer;
    var addressError: NSErrorPointer;
    var contractError: NSErrorPointer;

    // Get the bindContract from Rinkeby test network.
    let client = GethNewEthereumClient("https://rinkeby.infura.io/v3/398ed56d211646faaf010ca183de11f2", clientError);
    let contractAddress = GethNewAddressFromHex("0x7259667715d671Ee370d7788647f95Fe7C3B532d", addressError);

    guard let contractABI = ReadJsonResourceAsString(fileName: "InboxContractInterface", fileType: "json") else {
        print("[ViewController] failed to read the abi json as string.")
        return;
    }

    let boundContract = GethBindContract(contractAddress, contractABI, client, contractError);

    // Prepare the callOpts
    let callOpts = GethNewCallOpts();
    callOpts?.setGasLimit(300000);
    callOpts?.setContext(GethNewContext());


    // Prepare the results & params interfaces
    let results = GethNewInterfaces(1);
    let params = GethNewInterfaces(0);


    let stringResult = GethNewInterface();
    stringResult?.setDefaultString();
    try! results?.set(0, object: stringResult);

    // Make the call
    let methodName = "message";
    try! boundContract?.call(callOpts, out_: results, method: methodName, args: params);


    // Show results.
    print("[ViewController] message call result: " + (stringResult?.getString())!);

И это код моего контракта:

pragma solidity ^0.4.17;

contract Inbox {

    string public message;

    function Inbox (string initialMessage) public {
        message = initialMessage;
    }

    function setMessage (string newMessage) public {
        message = newMessage;

    }

}

person Baek Ryun    schedule 02.10.2018    source источник


Ответы (1)


Для тех, кто может найти ту же проблему, немного покопавшись, я нашел эту проблему для Android: https://github.com/ethereum/go-ethereum/issues/14832

К счастью, это уже исправлено, так что это полностью моя вина, что я не использовал последнюю версию. Я использовал Geth v1.5.9, поэтому после обновления до v1.8.2 он наконец заработал, но не уверен, какая промежуточная версия была исправлена.

person Baek Ryun    schedule 02.10.2018