
Web3.Swift - это библиотека Swift для подписания транзакций и взаимодействия с интеллектуальными контрактами в сети Ethereum.
Это позволяет вам подключаться к узлу Geth или Erigon Ethereum (например, цепочки) для отправки транзакций и чтения значений из интеллектуальных контрактов без необходимости написания собственных реализаций протоколов.
Web3.Swift поддерживает iOS, MacOS, TVOS, WatchOS и Linux с Swift Package Manager.
Проверьте использование ниже или просмотрите тесты репозиториев.
У уже есть какая -то библиотека Web3, написанная в Swift. Мы знаем их сильные и слабые стороны, и для нашего варианта использования они просто не работали.
Web3.swift был построен с учетом модульности, переносимости, скорости и эффективности.
Хорошо, спасибо за модные слова. Но что это на самом деле значит?
Web3.swift был создан для модульной. Если вы установите/используете базовый продукт Web3 SPM, вы получаете доступ к самым основным функциям, таким как подписание транзакций и взаимодействие с HTTP -сервером RPC.
Если вы хотите добавить поддержку для IPC RPC или чего -то еще, вы можете просто создать библиотеку, которая зависит от Web3 и реализует эту точную функциональность. Подробнее об этом позже.
Если вы хотите использовать расширения OrdeSkit для вызовов Web3, вы можете либо использовать предоставленный продукт Spearkit SPM, либо создать свой собственный.
Если вы хотите удобно проанализировать JSON ABIS для интеллектуальных контрактов Ethereum, вы можете использовать предоставленный продукт SPM ABI.
Наконец, если вы хотите добавить функциональность в Web3.swift , который еще не предоставлен, вам не нужно ждать, пока она не будет объединена и выпущена в версии. Вы можете простые функции расширения/обновления в собственном приложении, поскольку наши API сделаны очень открытыми для изменений.
Например, если вы хотите добавить метод Web3, который еще не предоставлен Web3.swift (мы будем поддерживать только методы поддержки Infura), вам нужно добавить только 3 строки кода (в зависимости от входных и выходных параметров метода). Добавление поддержки IPC RPC будет реализовать только протокол и запросы ответов.
Как вы можете видеть, все возможно с Web3.swift .
Одна из основных причин, по которой мы начали работать над этим проектом, заключается в том, что мы хотели использовать его с Swift Package Manager на разных платформах.
Из -за этого Web3.swift доступен через Swift Package Manager на iOS, MacOS, TVOS, WatchOS и Linux.
Примечание. Для SPM мы тестируем только iOS, MacOS и официально поддерживаемые дистрибутивы Linux (в настоящее время Ubuntu 16.04 и 20.04), но он должен быть совместимы со всеми небольшими эндианскими системами, которые способны компилировать компилятор Swift, Foundation и Glibc.
Мы стараемся сделать эту библиотеку как можно быстрее, пытаясь предоставить API, который увеличивает ваш рабочий процесс разработки так, чтобы вы могли сосредоточиться на создании отличных DAPP, а не беспокоиться о деталях реализации.
Все наши API безопасны и предназначены для использования в очень параллельных приложениях.
Web3 совместим с Swift Package Manager V5 (Swift 5 и выше). Просто добавьте его в зависимости в вашем Package.swift .
dependencies: [
. package ( url : " https://github.com/Boilertalk/Web3.swift.git " , from : " 0.6.0 " )
]А затем добавьте его к целевым зависимостям:
targets: [
. target (
name : " MyProject " ,
dependencies : [
. product ( name : " Web3 " , package : " Web3.swift " ) ,
. product ( name : " Web3PromiseKit " , package : " Web3.swift " ) ,
. product ( name : " Web3ContractABI " , package : " Web3.swift " ) ,
]
) ,
. testTarget (
name : " MyProjectTests " ,
dependencies : [ " MyProject " ] )
]Примечание.
Web3PromiseKitиWeb3ContractABIявляются необязательными, и вам нужно только поместить их в свои целевые зависимости (а затем импортировать их), если вы хотите их использовать.
После установки вы можете импортировать Web3 в ваших файлах .swift .
import Web3
// Optional
import Web3PromiseKit
import Web3ContractABIИз -за внутреннего решения мы перестали поддерживать любых менеджеров пакетов, кроме SPM, начиная с версии 0.5.0.
Чтобы немного уточнить это решение: с Xcode 11 и Swift 5.1 мы достигли точки с Swift Package Manager, где он постепенно начал делать других менеджеров пакетов нерелевантными. Вы уже можете загрузить все свои зависимости в проекте Xcode с помощью Swift Package Manager.
С большим количеством обновлений это стало еще более распространенным. Кокопод и соавторы Карфагена потеряли интерес к своему проекту и перестали его поддерживать. Есть много нерешенных проблем, много проблем, особенно для разработчиков библиотеки с кокоподами.
Так много хлопот без реальной выгоды. Пользователи уже могут поместить зависимости, которые поддерживают SPM в свой проект XCode. Так зачем беспокоиться?
Ответ прост. Некоторые по -прежнему используют Xcode <11, а некоторые разработчики библиотеки зависят от Web3 в своих собственных капсулах/карфаге.
Решение было трудным и заняло некоторое время. Но, увидев, что последняя версия была очень стабильной и уже использовалась во многих производственных приложениях, мы решили начать с этого хода сейчас.
Xcode 10 уже более 2 лет. Большинство проектов уже обновляются, те, у которых не было гораздо большей проблемы, чем Web3.Shift, не внося обновления для кокопод ...
Владельцам библиотеки в зависимости от Web3.Swift предлагается также сбросить кокопод и поддержку Карфагена.
SPM - это будущее. Для всех пользователей Cocoapods и Carthage, которые используют его, потому что многие библиотеки еще не переключались на SPM: вы все равно можете добавить web3.swift в качестве продукта SPM в свой .xcworkspace или .xcodeproj и держать все другие ваши зависимости внутри кокоапод/Карфаг. Но все же. Мы призываем вас переключиться с как можно большим количеством зависимостей на SPM. Лучше раньше, чем позже. Смотрите следующий раздел о том, как это сделать.
Используя Xcode 11 или более поздней версии (для iOS, MacOS или других платформ Apple), вы можете добавить пакеты SPM очень просты.
В XCode выберите свой проект, в раскрывающемся списке выберите проект, а не на одну цель, на вкладках выберите Swift Packages .
Затем вы можете щелкнуть значок + и поместить URL в этот репозиторий (https://github.com/boilertalk/web3.swift).
Теперь вы можете выбрать все продукты и просто нажмите «Далее», пока не будет добавлена зависимость.
Вот и все. Если вы продвигаете свои изменения, даже ваш CI не вызовет никаких проблем. Никаких хлопот с устаревшими репозиториями спецификации, никаких проблем с некоторыми странными ошибками линкера, которые возникают только иногда/с некоторыми зависимостями.
Если вам нужно дальнейшее руководство, присоединяйтесь к нашей Telegram Group, и мы поможем вам. https://t.me/web3_swift
С Web3.swift вы можете использовать узел Ethereum на сервере для связи с Ethereum.
Вы можете отправлять подписанные транзакции, прочитать данные контракта, вызовать функции контракта и многое другое.
Базовый класс для всех доступных методов - Web3 . Вы можете, например, создать его с помощью HTTP -поставщика:
let web3 = Web3 ( rpcURL : " https://mainnet.infura.io/<your_infura_id> " ) Все методы web3_ доступны непосредственно из структуры Web3 . Методы net_ доступны под net Struct в web3 struct. Методы eth_ доступны в eth Struct в web3 struct.
Пожалуйста, смотрите примеры ниже
Примечание: для примеров для работы вам нужно импортировать Web3 и Presingkit First
Возвращает текущую версию клиента.
Параметры
никто
Возврат
String - текущая версия клиента
firstly {
web3 . clientVersion ( )
} . done { version in
print ( version )
} . catch { error in
print ( " Error " )
} Возвращает текущий идентификатор сети.
Параметры
никто
Возврат
String - текущий идентификатор сети
firstly {
web3 . net . version ( )
} . done { version in
print ( version )
} . catch { error in
print ( " Error " )
} Возвращает количество сверстников, которые в настоящее время подключены к клиенту.
Параметры
никто
Возврат
EthereumQuantity - Bigint of Cifsive Connected Peers.
firstly {
web3 . net . peerCount ( )
} . done { ethereumQuantity in
print ( ethereumQuantity . quantity )
} . catch { error in
print ( " Error " )
} Создает новую транзакцию вызова сообщения или создание контракта для подписанных транзакций.
Параметры
EthereumTransaction : подписанная транзакцияВозврат
EthereumData , 32 байта - хэш транзакции или нулевой хэш, если транзакция еще не доступна
Чтобы отправить какой -то ETH, вам сначала нужно получить текущее количество транзакций отправителя (Nonce), создать транзакцию, подписать ее, а затем отправить.
let privateKey = try ! EthereumPrivateKey ( hexPrivateKey : " 0xa26da69ed1df3ba4bb2a231d506b711eace012f1bd2571dfbfff9650b03375af " )
firstly {
web3 . eth . getTransactionCount ( address : privateKey . address , block : . latest )
} . then { nonce in
let tx = try EthereumTransaction (
nonce : nonce ,
gasPrice : EthereumQuantity ( quantity : 21 . gwei ) ,
gas : 21000 ,
to : EthereumAddress ( hex : " 0xC0866A1a0ed41e1aa75c932cA3c55fad847fd90D " , eip55 : true ) ,
value : EthereumQuantity ( quantity : 1 . eth )
)
return try tx . sign ( with : privateKey , chainId : 1 ) . promise
} . then { tx in
web3 . eth . sendRawTransaction ( transaction : tx )
} . done { hash in
print ( hash )
} . catch { error in
print ( error )
} firstly {
web3 . eth . getBlockTransactionCountByNumber ( block : . block ( 5397389 ) )
} . done { count in
print ( count ) // 88
} . catch { error in
print ( error )
} Для получения дополнительных примеров либо прочитаны через наши тестовые примеры, Web3 Struct или официальную документацию Ethereum JSON RPC.
Мы предоставляем дополнительный модуль для взаимодействия с умными контрактами. Чтобы использовать его, вы должны добавить Web3ContractABI к целевым зависимостям в вашем Podfile (для SPM). Сначала убедитесь, что вы проверите инструкции по установке.
Мы предоставляем два разных варианта для создания контрактных интерфейсов ABI в Swift. Либо вы определяете свои функции и события вручную (или используете один из наших предоставленных интерфейсов, таких как ERC20 или ERC721). Или вы анализируете их с представления JSON ABI, как в Web3.js.
Статические контракты - это классы, реализующие StaticContract . Они предоставляют набор функций и событий, которые они хотят использовать из исходного интеллектуального контракта. Проверьте наши предоставленные статические контракты в качестве отправной точки (ERC20 или ERC721).
Наш статический интерфейс ERC20 называется GenericERC20Contract , контракт ERC721 называется GenericERC721Contract . Оба могут быть подклассы, чтобы добавить больше функций для пользовательских контрактов.
С этими типами StaticContract вы можете создавать, и использовать свой контракт, как в следующем примере (мы снова используем Sporskit в наших примерах).
let web3 = Web3 ( rpcURL : " https://mainnet.infura.io/<your_infura_id> " )
let contractAddress = try EthereumAddress ( hex : " 0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0 " , eip55 : true )
let contract = web3 . eth . Contract ( type : GenericERC20Contract . self , address : contractAddress )
// Get balance of some address
firstly {
try contract . balanceOf ( address : EthereumAddress ( hex : " 0x3edB3b95DDe29580FFC04b46A68a31dD46106a4a " , eip55 : true ) ) . call ( )
} . done { outputs in
print ( outputs [ " _balance " ] as? BigUInt )
} . catch { error in
print ( error )
}
// Send some tokens to another address (locally signing the transaction)
let myPrivateKey = try EthereumPrivateKey ( hexPrivateKey : " ... " )
firstly {
web3 . eth . getTransactionCount ( address : myPrivateKey . address , block : . latest )
} . then { nonce in
try contract . transfer ( to : EthereumAddress ( hex : " 0x3edB3b95DDe29580FFC04b46A68a31dD46106a4a " , eip55 : true ) , value : 100000 ) . createTransaction (
nonce : nonce ,
gasPrice : EthereumQuantity ( quantity : 21 . gwei ) ,
maxFeePerGas : nil ,
maxPriorityFeePerGas : nil ,
gasLimit : 100000 ,
from : myPrivateKey . address ,
value : 0 ,
accessList : [ : ] ,
transactionType : . legacy
) ! . sign ( with : myPrivateKey ) . promise
} . then { tx in
web3 . eth . sendRawTransaction ( transaction : tx )
} . done { txHash in
print ( txHash )
} . catch { error in
print ( error )
}
// Send some tokens to another address (signing will be done by the node)
let myAddress = try EthereumAddress ( hex : " 0x1f04ef7263804fafb839f0d04e2b5a6a1a57dc60 " , eip55 : true )
firstly {
web3 . eth . getTransactionCount ( address : myAddress , block : . latest )
} . then { nonce in
try contract . transfer ( to : EthereumAddress ( hex : " 0x3edB3b95DDe29580FFC04b46A68a31dD46106a4a " , eip55 : true ) , value : 100000 ) . send (
nonce : nonce ,
gasPrice : EthereumQuantity ( quantity : 21 . gwei ) ,
maxFeePerGas : nil ,
maxPriorityFeePerGas : nil ,
gasLimit : 150000 ,
from : myAddress ,
value : 0 ,
accessList : [ : ] ,
transactionType : . legacy
)
} . done { txHash in
print ( txHash )
} . catch { error in
print ( error )
}Создавая свои собственные интерфейсы, вы можете взаимодействовать с любым умным контрактом!
Если у вас есть только доступ к JSON ABI с умным контрактом или вы не хотите создавать статический шаблон, вы можете использовать наш динамический API контракта для разбора строки JSON в полезной контракт во время выполнения . См. Пример ниже.
let web3 = Web3 ( rpcURL : " https://mainnet.infura.io/<your_infura_id> " )
let contractAddress = try EthereumAddress ( hex : " 0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0 " , eip55 : true )
let contractJsonABI = " <your contract ABI as a JSON string> " . data ( using : . utf8 ) !
// You can optionally pass an abiKey param if the actual abi is nested and not the top level element of the json
let contract = try web3 . eth . Contract ( json : contractJsonABI , abiKey : nil , address : contractAddress )
print ( contract . methods . count )
// Get balance of some address
firstly {
try contract [ " balanceOf " ] ! ( EthereumAddress ( hex : " 0x3edB3b95DDe29580FFC04b46A68a31dD46106a4a " , eip55 : true ) ) . call ( )
} . done { outputs in
print ( outputs [ " _balance " ] as? BigUInt )
} . catch { error in
print ( error )
}
// Send some tokens to another address (locally signing the transaction)
let myPrivateKey = try EthereumPrivateKey ( hexPrivateKey : " ... " )
guard let transaction = contract [ " transfer " ] ? ( EthereumAddress . testAddress , BigUInt ( 100000 ) ) . createTransaction (
nonce : 0 ,
gasPrice : EthereumQuantity ( quantity : 21 . gwei ) ,
maxFeePerGas : nil ,
maxPriorityFeePerGas : nil ,
gasLimit : 150000 ,
from : myPrivateKey . address ,
value : 0 ,
accessList : [ : ] ,
transactionType : . legacy
) ) else {
return
}
let signedTx = try transaction . sign ( with : myPrivateKey )
firstly {
web3 . eth . sendRawTransaction ( transaction : signedTx )
} . done { txHash in
print ( txHash )
} . catch { error in
print ( error )
}Используя этот API, вы можете взаимодействовать с любым умным контрактом в сети Ethereum!
Для получения дополнительных примеров, включая создание контракта (Constructor Calling), ознакомьтесь с нашими тестами.
Если вы получаете эту ошибку при анализе вашего ABI от JSON, это может быть связано с тем, что ваш контракт имеет резервную функцию. Чтобы решить его, удалите фрагмент вашего ABI, который имеет информацию о резервной функции. Часть, которую вы должны удалить, может выглядеть так:
{
"payable": false,
"stateMutability": "nonpayable",
"type": "fallback"
},
До тех пор, пока мы не достигнем версии 1.0.0, наш API подчиняется прерыванию изменений между незначительными скачками версии. Это должно убедиться, что мы можем сосредоточиться на обеспечении наилучшей реализации, в то время как мы находимся в тяжелом развитии, вместо того, чтобы пытаться сохранить что -то, что устарело.
При этом мы постараемся свести к минимуму нарушения изменений. Конечно, не будет много.
Потрясающие парни из Coalertalk ⚗
... и еще более потрясающие участники сообщества?
Проверьте список участников для полного списка.
Web3 доступен по лицензии MIT. Смотрите файл лицензии для получения дополнительной информации.