Взаимодействие с настраиваемым смарт-контрактом с помощью web3swift

Я использую библиотеку web3swift, и мне удалось совершить несколько транзакций, в основном get (balanceOf, owner и т. Д.). Я прочитал весь файл readme (документацию), но не совсем уверен, можем ли мы использовать эту библиотеку для вызова функций из наших пользовательских смарт-контрактов? Например, у меня есть смарт-контракт магазина, и я хочу вызвать из него функцию покупки? Я видел, что мы можем передавать токены eth и ERC20, но для меня этого недостаточно. Любая помощь по этому поводу?


person maptuhec    schedule 12.07.2018    source источник
comment
У меня тот же вопрос, и я не вижу ответа на него нигде в проекте, кроме краткого обсуждения здесь: github .com / BANKEX / web3swift / issues / 46 Я открыл здесь проблему, github.com / BANKEX / web3swift / issues / 188   -  person mattgabor    schedule 16.07.2018
comment
к сведению: @mattgabor официальные сторонники репо переместили его на github.com/matterinc/web3swift   -  person skywinder    schedule 12.09.2018


Ответы (1)


Да, вы можете вызывать любую функцию в своем индивидуальном смарт-контракте. Вот пример.

        let infura = Web3.InfuraMainnetWeb3()
        // 1
        let contract = infura.contract(someABI, at: ethContractAddress, abiVersion: 2)
        // 2
        var options = Web3Options.defaultOptions()
        options.from = address
        // 3 
        let transactionIntermediate = contract?.method("accountExists", parameters:[address] as [AnyObject], options: options)
        // 4
        let result = transactionIntermediate!.call(options: options)
        switch result {
        // 5    
        case .success(let res):
            let ans = res["0"] as! Bool
            DispatchQueue.main.async {
                completion(Result.Success(ans))
            }
        case .failure(let error):
            DispatchQueue.main.async {
                completion(Result.Error(error))
            }
        }
    }  
  1. Настройка контракта и ABI. Для этого вам нужен адрес контракта в формате данных или строки. let ethContractAddress = EthereumAddress("0xfa28eC7198028438514b49a3CF353BcA5541ce1d")! Вы можете получить ABI вашего контракта прямо из Remix IDE.
  2. Настройте все необходимые параметры.
  3. Вероятно, одна из основных частей ответа - здесь вы создаете транзакцию с именем метода контракта и вводите в нее все параметры, необходимые этому методу. 4.Здесь вы можете позвонить или отправить транзакцию. call метод предназначен для методов с view идентификатором в solidity, поэтому вы не будете платить за него, а метод send () предназначен для методов смарт-контракта, которые должны быть оплачены газом за выполнение.
  4. Здесь вы просто анализируете результат, возвращаемый методом. Вы должны знать типы данных переменных, которые хотите получить из конкретного метода, чтобы правильно их анализировать.

Надеюсь, мой ответ вам поможет! Если что-то еще непонятно - смело спрашивайте! :)

person Georgy Fesenko    schedule 22.08.2018
comment
Спасибо за ответ. Это работает, мне удалось сделать это сам с помощью кода, очень похожего на этот. - person maptuhec; 29.08.2018
comment
@maptuhec рад это слышать! не могли бы вы принять ответ в этом случае? :) - person skywinder; 02.10.2018
comment
Спасибо за ответ. Как узнать типы параматеров? Я пытаюсь использовать солитидные функции типа этого: function get_data_string_by_id (uint256 tokenId) {..} - person Jørgen Svennevik Notland; 25.04.2019
comment
+ Похоже, что Web3Options.defaultOptions () устарел? github.com/matter-labs/web3swift/pull/120 Может быть, использовать: let infura = Web3.InfuraMainnetWeb3 () + infura.transactionOptions.from = адрес - person Jørgen Svennevik Notland; 25.04.2019