Web3Swift 使用筆記 1

LULU
彼得潘的 Swift iOS App 開發教室
8 min readJun 29, 2022

--

Web3Swift是用於與以太坊網絡互動的iOS工具。
(最近因為工作需要都在看新東西,眼花撩亂😵‍💫想想好像太久沒更新了XD

首先先安裝CocoaPods

sudo gem install cocoapods

打開Podfile添加以下資訊

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
target '<Your Target Name>' do
use_frameworks!
pod 'web3swift'
end

之後 pod install

Carthage是一個去中心化管理,提供你建構二進制的框架(翻譯好難QQ

$ brew update
$ brew install carthage

使用 Carthage 將 web3swift 整合到的 Xcode 項目中,請在的 Cartfile 中指定它。 使用 touch 命令創建一個空的 Cartfile 並打開它:

$ touch Cartfile
$ open -a Xcode Cartfile

將以下行添加到 Cartfile 並保存:

github "skywinder/web3swift" "master"

有興趣請看詳細內容:

關於API

Preferred keys Wallet Model (Account)

struct Wallet {
let address: String
let data: Data
let name: String
let isHD: Bool
}
struct HDKey {
let name: String?
let address: String
}

Preferred ERC-20 Model

class ERC20Token {
var name: String
var address: String
var decimals: String
var symbol: String
}

Create Account

With Private Key

let password = "web3swift" // We recommend here and everywhere to use the password set by the user.
let keystore = try! EthereumKeystoreV3(password: password)!
let name = "New Wallet"
let keyData = try! JSONEncoder().encode(keystore.keystoreParams)
let address = keystore.addresses!.first!.address
let wallet = Wallet(address: address, data: keyData, name: name, isHD: false)

With Mnemonics Phrase

let password = "web3swift"
let bitsOfEntropy: Int = 128 // Entropy is a measure of password strength. Usually used 128 or 256 bits.
let mnemonics = try! BIP39.generateMnemonics(bitsOfEntropy: bitsOfEntropy)!
let keystore = try! BIP32Keystore(
mnemonics: mnemonics,
password: password,
mnemonicsPassword: "",
language: .english)!
let name = "New HD Wallet"
let keyData = try! JSONEncoder().encode(keystore.keystoreParams)
let address = keystore.addresses!.first!.address
let wallet = Wallet(address: address, data: keyData, name: name, isHD: true)

Import Account

With Private Key

let password = "web3swift"
let key = "L2HRewdY7SSpB2jjKq6mwLes86umkWBuUSPZWE35Q8Pbbr8wVyss124sf124dfsf" // Some private key
let formattedKey = key.trimmingCharacters(in: .whitespacesAndNewlines)
let dataKey = Data.fromHex(formattedKey)!
let keystore = try! EthereumKeystoreV3(privateKey: dataKey, password: password)!
let name = "New Wallet"
let keyData = try! JSONEncoder().encode(keystore.keystoreParams)
let address = keystore.addresses!.first!.address
let wallet = Wallet(address: address, data: keyData, name: name, isHD: false)

With Mnemonics Phrase

let password = "web3swift"
let mnemonics = "fine have legal roof fury bread egg knee wrong idea must edit" // Some mnemonic phrase
let keystore = try! BIP32Keystore(
mnemonics: mnemonics,
password: password,
mnemonicsPassword: "",
language: .english)!
let name = "New HD Wallet"
let keyData = try! JSONEncoder().encode(keystore.keystoreParams)
let address = keystore.addresses!.first!.address
let wallet = Wallet(address: address, data: keyData, name: name, isHD: true)

Get Keystore Manager from wallet data

let data = wallet.data
let keystoreManager: KeystoreManager
if wallet.isHD {
let keystore = BIP32Keystore(data)!
keystoreManager = KeystoreManager([keystore])
} else {
let keystore = EthereumKeystoreV3(data)!
keystoreManager = KeystoreManager([keystore])
}

Get private key

let password = "web3swift"
let ethereumAddress = EthereumAddress(wallet.address)!
let pkData = try! keystoreManager.UNSAFE_getPrivateKeyData(password: password, account: ethereumAddress).toHexString()

名詞解釋(簡易篇)

  • HD Wallet(Hierarchical Deterministic Wallets)
    是一個系統可以從單一個 seed 產生一樹狀結構儲存多組 keypairs(私鑰和公鑰)。好處是可以方便的備份、轉移到其他相容裝置(因為都只需要 seed),以及分層的權限控制等。
  • BIP ( Bitcoin Improvement Proposal )
    BIP39 : 將 seed 用方便記憶和書寫的單字表示。一般由 12 個單字組成,稱為 mnemonic code(phrase),中文稱為助記詞或助記碼。
  • Infura是一個可以讓你的DApp 快速接入以太坊的平台,不需要本地運行以太坊節點。以太坊許多知名的項目(MetaMask,Aragon,Gnosis,OpenZeppelin 等)都利用Infura 的API 將其應用程序連接到以太坊網絡。作為以太坊生態中最大的API 提供方。
  • ABI : 應用二進位介面(application binary interface,縮寫為ABI)是指兩程式模組間的介面;通常其中一個程式模組會是函式庫或作業系統所提供的服務,而另一邊的模組則是使用者所執行的程式。
  • EIP2930 : Optional access lists
    因為有些合約有hardcode external call的gas 上限。對於這方面的問題,EIP2930提出一個新的交易類型,讓交易中多帶一個access list,即所有這筆交易即將讀寫的storage slot,並且先幫忙付掉第一次讀寫的gas,而真正交易讀寫該storage時,只會被要求付100 gas。
  • ENS : 以太坊名稱服務 (ENS) 是錢包地址、雜湊及其他機器可讀的識別碼的命名服務。

--

--

LULU
彼得潘的 Swift iOS App 開發教室

Hi👋 I’m iOS developer, I hope I can grow with you guys ☺️ Let’s learn more together.