Я использую библиотеку web3swift, и мне удалось совершить несколько транзакций, в основном get (balanceOf, owner и т. Д.). Я прочитал весь файл readme (документацию), но не совсем уверен, можем ли мы использовать эту библиотеку для вызова функций из наших пользовательских смарт-контрактов? Например, у меня есть смарт-контракт магазина, и я хочу вызвать из него функцию покупки? Я видел, что мы можем передавать токены eth и ERC20, но для меня этого недостаточно. Любая помощь по этому поводу?
Взаимодействие с настраиваемым смарт-контрактом с помощью web3swift
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))
}
}
}
- Настройка контракта и ABI. Для этого вам нужен адрес контракта в формате данных или строки.
let ethContractAddress = EthereumAddress("0xfa28eC7198028438514b49a3CF353BcA5541ce1d")!
Вы можете получить ABI вашего контракта прямо из Remix IDE. - Настройте все необходимые параметры.
- Вероятно, одна из основных частей ответа - здесь вы создаете транзакцию с именем метода контракта и вводите в нее все параметры, необходимые этому методу. 4.Здесь вы можете позвонить или отправить транзакцию.
call
метод предназначен для методов сview
идентификатором в solidity, поэтому вы не будете платить за него, а метод send () предназначен для методов смарт-контракта, которые должны быть оплачены газом за выполнение. - Здесь вы просто анализируете результат, возвращаемый методом. Вы должны знать типы данных переменных, которые хотите получить из конкретного метода, чтобы правильно их анализировать.
Надеюсь, мой ответ вам поможет! Если что-то еще непонятно - смело спрашивайте! :)
person
Georgy Fesenko
schedule
22.08.2018
Спасибо за ответ. Это работает, мне удалось сделать это сам с помощью кода, очень похожего на этот.
- person maptuhec; 29.08.2018
@maptuhec рад это слышать! не могли бы вы принять ответ в этом случае? :)
- person skywinder; 02.10.2018
Спасибо за ответ. Как узнать типы параматеров? Я пытаюсь использовать солитидные функции типа этого: function get_data_string_by_id (uint256 tokenId) {..}
- person Jørgen Svennevik Notland; 25.04.2019
+ Похоже, что Web3Options.defaultOptions () устарел? github.com/matter-labs/web3swift/pull/120 Может быть, использовать: let infura = Web3.InfuraMainnetWeb3 () + infura.transactionOptions.from = адрес
- person Jørgen Svennevik Notland; 25.04.2019