
Web3.swift adalah perpustakaan Swift untuk menandatangani transaksi dan berinteraksi dengan kontrak pintar di jaringan Ethereum.
Ini memungkinkan Anda untuk terhubung ke simpul Geth atau Erigon Ethereum (seperti ChainNodes) untuk mengirim transaksi dan membaca nilai dari kontrak pintar tanpa perlu menulis implementasi protokol Anda sendiri.
Web3.swift mendukung iOS, macOS, TVOS, WatchOS dan Linux dengan Swift Package Manager.
Periksa penggunaan di bawah ini atau lihat melalui tes repositori.
Sudah ada beberapa perpustakaan Web3 di luar sana yang ditulis di Swift. Kami tahu kekuatan dan kelemahan mereka dan untuk kasus penggunaan kami, mereka tidak berhasil.
Web3.swift dibangun dengan modularitas, portabilitas, kecepatan, dan efisiensi dalam pikiran.
Oke, terima kasih atas kata kunci. Tapi apa arti sebenarnya ini?
Web3.swift dibangun untuk menjadi modular. Jika Anda menginstal/menggunakan produk dasar Web3 SPM, Anda mendapatkan akses ke fungsi paling dasar seperti penandatanganan transaksi dan berinteraksi dengan server RPC HTTP.
Jika Anda ingin menambahkan dukungan untuk IPC RPC atau yang lainnya, Anda dapat secara sederhana membuat perpustakaan yang tergantung pada Web3 dan mengimplementasikan fungsionalitas yang tepat ini. Lebih lanjut tentang itu nanti.
Jika Anda ingin menggunakan ekstensi janji untuk panggilan Web3, Anda dapat menggunakan produk SPM Promiskit yang disediakan atau membuat sendiri.
Jika Anda ingin mem -parsing JSON Abis untuk kontrak pintar Ethereum, Anda dapat menggunakan produk SPM ABI parsing yang disediakan.
Akhirnya, jika Anda ingin menambahkan fungsionalitas ke Web3.swift yang belum disediakan, Anda tidak perlu menunggu sampai digabungkan dan dirilis dalam benjolan versi. Anda dapat memperpanjang/memperbarui fungsionalitas dalam aplikasi Anda sendiri karena API kami dibuat sangat terbuka untuk perubahan.
Misalnya, jika Anda ingin menambahkan metode Web3 yang belum disediakan oleh Web3.swift (kami hanya akan mendukung metode yang didukung infura), Anda hanya perlu menambahkan 3 baris kode (tergantung pada parameter input dan output dari metode ini). Menambahkan dukungan RPC IPC hanya akan menerapkan protokol dan menjawab permintaan.
Seperti yang Anda lihat, semuanya mungkin dengan Web3.swift .
Salah satu alasan utama kami mulai mengerjakan proyek ini adalah karena kami ingin menggunakannya dengan Swift Package Manager pada platform yang berbeda.
Karena itu, Web3.swift tersedia melalui Swift Package Manager di iOS, MacOS, TVOS, WatchOS dan Linux.
CATATAN: Untuk SPM kami hanya menguji distribusi Linux IOS, MacOS, dan secara resmi didukung (saat ini Ubuntu 16.04 dan 20.04) tetapi harus kompatibel dengan semua sistem Endian kecil yang mampu mengkompilasi kompiler Swift, foundation, dan glibc.
Kami mencoba membuat perpustakaan ini secepat mungkin saat mencoba menyediakan API yang meningkatkan alur kerja pengembangan Anda sehingga Anda dapat fokus membangun DAPP yang hebat alih -alih mengkhawatirkan detail implementasi.
Semua API kami aman dan dirancang untuk digunakan dalam aplikasi yang sangat bersamaan.
Web3 kompatibel dengan Swift Package Manager V5 (Swift 5 dan di atas). Cukup tambahkan ke dependensi di Package.swift Anda.
dependencies: [
. package ( url : " https://github.com/Boilertalk/Web3.swift.git " , from : " 0.6.0 " )
]Dan kemudian tambahkan ke dependensi target Anda:
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 " ] )
]Catatan:
Web3PromiseKitdanWeb3ContractABIadalah opsional dan Anda hanya perlu memasukkannya ke dalam dependensi target Anda (dan kemudian mengimpornya) jika Anda ingin menggunakannya.
Setelah instalasi, Anda dapat mengimpor Web3 di file .swift Anda.
import Web3
// Optional
import Web3PromiseKit
import Web3ContractABIKarena keputusan internal, kami berhenti mendukung manajer paket apa pun selain SPM yang dimulai dengan versi 0.5.0.
Untuk menguraikan sedikit tentang keputusan ini: dengan Xcode 11 dan Swift 5.1 kami mencapai titik dengan manajer paket Swift di mana ia perlahan -lahan mulai membuat manajer paket lain tidak relevan. Anda sudah bisa memuat semua dependensi Anda di proyek XCODE dengan Swift Package Manager.
Dengan lebih banyak pembaruan itu menjadi lebih umum. Cocoapods dan Carthage Loaders kehilangan minat dalam proyek mereka dan berhenti mempertahankannya. Ada banyak masalah yang belum terselesaikan, banyak masalah terutama bagi pengembang perpustakaan dengan cocoapod.
Begitu banyak kerumitan tanpa keuntungan nyata. Pengguna sudah dapat menempatkan dependensi yang mendukung SPM ke dalam proyek XCODE mereka. Jadi mengapa repot -repot?
Jawabannya sederhana. Beberapa masih menggunakan Xcode <11 dan beberapa pengembang perpustakaan bergantung pada Web3 di pod/carthages mereka sendiri.
Keputusan itu sulit dan membutuhkan waktu. Tetapi setelah melihat bahwa versi terakhir sangat stabil dan sudah digunakan di banyak aplikasi produksi, kami memutuskan untuk memulai dengan langkah ini sekarang.
Xcode 10 sudah berusia lebih dari 2 tahun. Sebagian besar proyek sudah ditingkatkan, yang tidak memiliki masalah yang jauh lebih besar daripada web3.swift tidak membuat pembaruan untuk cocoapods ...
Pemilik perpustakaan tergantung pada web3.swift didorong untuk menjatuhkan cocoapods dan dukungan carthage juga.
SPM adalah masa depan. Untuk semua pengguna Cocoapods dan Carthage yang menggunakannya karena banyak perpustakaan belum beralih ke SPM: Anda masih dapat menambahkan Web3.swift sebagai produk SPM ke dalam .xcworkspace atau .xcodeproj dan menyimpan semua ketergantungan Anda yang lain di dalam cocoapods/carthage. Tapi tetap saja. Kami mendorong Anda untuk beralih dengan dependensi sebanyak mungkin ke SPM. Lebih cepat lebih cepat daripada nanti. Lihat bagian selanjutnya tentang cara melakukan ini.
Menggunakan Xcode 11 atau lebih baru (untuk iOS, macOS atau platform Apple lainnya) Anda dapat menambahkan paket SPM dengan sangat mudah.
Di Xcode, pilih proyek Anda, dari dropdown pilih proyek, bukan target tunggal, di tab Pilih Swift Packages .
Kemudian Anda dapat mengklik Ikon + dan memasukkan URL ke repositori ini (https://github.com/boilertalk/web3.swift).
Sekarang Anda dapat memilih semua produk dan cukup klik berikutnya sampai ketergantungan ditambahkan.
Itu saja. Jika Anda mendorong perubahan, bahkan CI Anda tidak akan membuat masalah. Tidak ada kerepotan dengan repositori spesifikasi yang sudah ketinggalan zaman, tidak ada masalah dengan beberapa kesalahan penghubung aneh yang hanya terjadi kadang -kadang/dengan beberapa dependensi.
Jika Anda memerlukan panduan lebih lanjut, bergabunglah dengan grup telegram kami dan kami akan membantu Anda. https://t.me/web3_swift
Dengan Web3.swift Anda dapat menggunakan node Ethereum di server untuk berkomunikasi dengan Ethereum.
Anda dapat mengirim transaksi yang ditandatangani, membaca data kontrak, fungsi kontrak panggilan dan banyak lagi.
Kelas dasar untuk semua metode yang tersedia adalah Web3 . Anda dapat, misalnya, instantiate dengan penyedia HTTP:
let web3 = Web3 ( rpcURL : " https://mainnet.infura.io/<your_infura_id> " ) Semua metode web3_ tersedia langsung dari struct Web3 . Metode net_ tersedia di bawah struct net di struct web3 . Metode eth_ tersedia di bawah struct eth dalam struct web3 .
Silakan lihat contoh di bawah ini
CATATAN: Agar contoh berfungsi, Anda perlu mengimpor Web3 dan Promiskit terlebih dahulu
Mengembalikan versi klien saat ini.
Parameter
tidak ada
Kembali
String - Versi Klien Saat Ini
firstly {
web3 . clientVersion ( )
} . done { version in
print ( version )
} . catch { error in
print ( " Error " )
} Mengembalikan ID jaringan saat ini.
Parameter
tidak ada
Kembali
String - ID jaringan saat ini
firstly {
web3 . net . version ( )
} . done { version in
print ( version )
} . catch { error in
print ( " Error " )
} Mengembalikan jumlah rekan yang saat ini terhubung ke klien.
Parameter
tidak ada
Kembali
EthereumQuantity - Bigint dari jumlah rekan yang terhubung.
firstly {
web3 . net . peerCount ( )
} . done { ethereumQuantity in
print ( ethereumQuantity . quantity )
} . catch { error in
print ( " Error " )
} Membuat transaksi panggilan pesan baru atau pembuatan kontrak untuk transaksi yang ditandatangani.
Parameter
EthereumTransaction : Transaksi yang DitandatanganiKembali
EthereumData , 32 byte - hash transaksi, atau hash nol jika transaksi belum tersedia
Untuk mengirim beberapa ETH, Anda pertama -tama harus mendapatkan jumlah transaksi saat ini dari pengirim (Nonce), membuat transaksi, menandatangani dan kemudian mengirimkannya.
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 )
} Untuk lebih banyak contoh baik membaca kasus uji kami, Web3 Struct atau dokumentasi RPC Ethereum JSON resmi.
Kami menyediakan modul opsional untuk interaksi dengan kontrak pintar. Untuk menggunakannya, Anda harus menambahkan Web3ContractABI ke dependensi target Anda di podfile Anda (untuk SPM). Pastikan Anda memeriksa instruksi instalasi terlebih dahulu.
Kami menyediakan dua opsi berbeda untuk membuat kontrak ABI Interfaces di Swift. Entah Anda mendefinisikan fungsi dan acara Anda secara manual (atau menggunakan salah satu antarmuka yang disediakan seperti ERC20 atau ERC721). Atau Anda mengurai mereka dari representasi JSON ABI seperti di Web3.js.
Kontrak statis adalah kelas yang menerapkan StaticContract . Mereka menyediakan serangkaian fungsi dan acara yang ingin mereka gunakan dari kontrak pintar asli. Lihat kontrak statis yang disediakan sebagai titik awal (ERC20 atau ERC721).
Antarmuka ERC20 statis kami disebut GenericERC20Contract , kontrak ERC721 disebut GenericERC721Contract . Keduanya dapat disubklass untuk menambahkan lebih banyak fungsi untuk kontrak khusus.
Dengan tipe -jenis StaticContract yang dapat Anda buat dan menggunakan kontrak Anda seperti dalam contoh berikut (kami menggunakan Promiskit lagi dalam contoh kami).
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 )
}Dengan membuat antarmuka Anda sendiri, Anda dapat berinteraksi dengan kontrak pintar apa pun!
Jika Anda hanya memiliki akses ke JSON ABI dari kontrak pintar atau Anda tidak ingin membuat template statis, Anda dapat menggunakan API kontrak dinamis kami untuk menguraikan string JSON ke dalam kontrak yang dapat digunakan selama runtime . Lihat contoh di bawah ini.
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 )
}Menggunakan API ini Anda dapat berinteraksi dengan kontrak pintar apa pun di jaringan Ethereum!
Untuk lebih banyak contoh, termasuk pembuatan kontrak (panggilan konstruktor), periksa tes kami.
Jika Anda mendapatkan kesalahan ini saat mem -parsing ABI Anda dari JSON, itu mungkin karena kontrak Anda memiliki fungsi fallback. Untuk menyelesaikannya, hapus fragmen ABI Anda yang memiliki informasi tentang fungsi fallback. Bagian yang harus Anda hapus mungkin terlihat seperti ini:
{
"payable": false,
"stateMutability": "nonpayable",
"type": "fallback"
},
Sampai kami mencapai versi 1.0.0 API kami dapat melanggar perubahan antara lompatan versi minor. Ini untuk memastikan kami dapat fokus pada penyediaan implementasi terbaik saat kami sedang dalam pengembangan berat alih -alih mencoba mempertahankan sesuatu yang sudah usang.
Yang sedang berkata, kami akan mencoba meminimalkan perubahan. Paling pasti tidak akan banyak.
Orang -orang yang luar biasa di Boilertalk ⚗️
... dan bahkan lebih banyak anggota yang luar biasa dari komunitas?
Lihat daftar kontributor untuk daftar lengkap.
Web3 tersedia di bawah lisensi MIT. Lihat file lisensi untuk info lebih lanjut.