web3swift
web3swift 是与 Ethereum 网络交互的工具包。
设计决策
- 并非所有 JSON RPC 函数都已公开,优先考虑移动设备所需的函数。
- 功能集中在本地设备上序列化和签名交易,以向 Ethereum 网络发送原始交易。
- 在每笔交易中进行密码输入的要求确实是一个设计决策。界面设计人员可以在用户同意的情况下保存用户的密码。
- 公开了用于私钥导出的公共函数,以方便用户,但已标记为 UNSAFE_ :) 正常工作流程负责 EIP155 兼容性以及从内存中正确清除私钥数据。
使用 web3swift 的项目
如果你在你的项目中使用此库,请在此仓库中添加链接。
- MyEtherWallet/MEWconnect-iOS
- Peepeth iOS 客户端
- Ethereum & ERC20Tokens 钱包
- BankexWallet
- GeoChain
- NewHorizonLabs/TRX-Wallet
- SteadyAction/EtherWalletKit
- UP 钱包/loopr-ios
- 我的 ENS 钱包
- LoanStar
- AlphaWallet
- Follow_iOS
- 生物医学数据共享 dApp - 地理位置信息
- 你的 APP 也可以在这里(点击我)
😉
没有什么比看到别人使用我们的工作并尽情发挥更让开发者开心的了。
安装
- CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。你可以使用以下命令安装它
$ sudo gem install cocoapods
要使用 CocoaPods 在你的 Xcode 项目中集成 web3swift,在 Podfile
中指定它
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
target '<Your Target Name>' do
use_frameworks!
pod 'web3.swift.pod', '~> 2.2.0'
end
然后,运行以下命令
$ pod install
- Carthage
Carthage 是一个去中心化的依赖管理器,它构建你的依赖并提供二进制框架。
你可以在使用以下命令的情况下使用 Homebrew 安装 Carthage
$ brew update
$ brew install carthage
要使用 Carthage 在你的 Xcode 项目中集成 web3swift,在 Cartfile
中指定它。创建一个空的 Cartfile,可以使用 touch 命令,并打开它
$ touch Cartfile
$ open -a Xcode Cartfile
将以下行添加到 Cartfile 中并保存它
github "matter-labs/web3swift" "master"
运行 carthage update
来构建框架。默认情况下,Carthage 在与 Cartfile 相同位置的 'Carthage' 的新目录中进行检出和构建。打开此目录,转到 'Build' 目录,选择 iOS 或 macOS 目录,并在 Xcode 项目中使用所选目录中的框架。
要求
- iOS 9.0+ / macOS 10.11+
- Xcode 10.2+
- Swift 5.0+
迁移指南
文档
请查阅完整源码请看 文档目录
以下是基本功能的快速参考
示例
你可以通过运行示例项目来尝试lib
- 克隆仓库:
git clone https://github.com/matter-labs/web3swift.git
- 转到仓库:
cd web3swift/Example/web3swiftExample
- 安装依赖:
pod install
- 打开:
open ./web3swiftExample.xcworkspace
常见问题解答
使用web3swift从私钥获取助记短语(种子短语)是否可能?
在web3swift中没有从私钥到助记短语的逆向转换。从理论上讲,无法从私钥恢复短语。在将种子短语转换为某些初始熵后,就“派生了主密钥”,然后丢弃了初始熵。
最简单的解决方案是使用用户的PIN码加密短语,并将其保存到其他安全密钥库中。助记短语是敏感数据,你必须非常小心地让用户获得它。如果要将它展示给用户的建议 - 在创建BIP32Keystore时要求保存密码。
如何使用web3swift与自定义智能合约进行交互?
例如:你想要与智能合约交互,而你只知道其地址(地址示例:0xfa28eC7198028438514b49a3CF353BcA5541ce1d)。
你可以从Remix IDE(解决方案)直接获取你的合约的ABI
然后你应该使用合约地址和ABI来创建合约对象。在我们这个例子中,我们使用Infura主网
let yourContractABI: String = <CONTRACT JSON ABI>
let toEthereumAddress: EthereumAddress = <DESTINATION ETHEREUM ADDRESS>
let abiVersion: Int = <ABI VERSION NUMBER>
let contract = Web3.InfuraMainnetWeb3().contract(yourContractABI, at: toEthereumAddress, abiVersion: abiVersion)
以下是调用某些合约方法的示例
let method: String = <CONTRACT METHOD NAME>
let parameters: [AnyObject] = <PARAMETERS>
let extraData: Data = <DATA>
let transactionOptions: TransactionOptions = <OPTIONS>
let transaction = contract.read(method, parameters: parameters, extraData: extraData, transactionOptions: transactionOptions)
以下是向某些合约方法发送交易的示例
let method: String = <CONTRACT METHOD NAME>
let parameters: [AnyObject] = <PARAMETERS>
let extraData: Data = <DATA>
let transactionOptions: TransactionOptions = <OPTIONS>
let transaction = contract.write(method, parameters: parameters, extraData: extraData, transactionOptions: transactionOptions)
如何设置测试本地节点?你可以写入如下内容
func setLocalNode(port: Int = 8545) -> Web3? {
guard let web3 = Web3(url: URL(string: "http://127.0.0.1:\(port)")!) else { return nil }
return web3
}
致谢
亚历克斯·弗拉索夫,@shamatar
彼得·科尔列夫,@skywinder
安东·格里戈列夫,@baldyash
我们已经完成的工作
-
Swift对web3.js功能的实现
⚡️ -
通过JSON RPC与远程节点进行交互
💭 -
本地keystore管理(与
geth
兼容) -
智能合约ABI解析
📖 -
ABI解包(支持V2,即从公开函数返回结构。0.4.22 Solidity编译器的一部分)
-
以太坊名称服务(ENS)支持 - 一种安全且去中心化的方式,使用简单易读的名称来表示区块链上和链下的资源地址
-
与智能合约的交互(读取/写入到智能合约)
🔄 -
完全支持Infura以太坊API,部分支持Websockets API
-
将TxPool内容解析为原生值(以太坊地址和交易) - 持续获取待处理交易
-
事件循环功能
-
支持Web3View功能 - 带有注入"web3"提供者的WKWebView
-
可以在"组装前"、"组装后"和"提交前"阶段添加或删除"中间件",以截取、修改甚至取消交易流程
-
严格遵循标准
- BIP32 HD钱包:确定性钱包
- BIP39(种子短语)
- BIP44(密钥生成前缀)
- EIP-20(代币标准的接口 - ERC-20)
- EIP-67(标准URI方案,包含元数据、值和字节码)
- EIP-155(重放攻击保护)强制执行!
- EIP-681(表示各种交易的标准化方式,特别是在Ethers和ERC-20代币中的支付请求作为URL)
- EIP-721(非同质化代币的标准接口,也称为忠诚证明 - ERC-721)
- EIP-165(标准接口检测,也称为ERC-165)
- EIP-777(新的高级代币标准,也称为ERC-777)
- EIP-820(伪自省注册合约,也称为ERC-820)
- EIP-888(多维度代币标准,也称为ERC-888)
- EIP-1400(安全代币标准,也称为ERC-1400)
- EIP-1410(部分同质化代币标准,也称为ERC-1410)
- EIP-1594(核心安全代币标准,也称为ERC-1594)
- EIP-1643(文档管理标准,也称为ERC-1643)
- EIP-1644 (控制代币操作标准,也称为ERC-1644)
- EIP-1633 (可重用代币,也称为ERC-1633)
- EIP-721x (ERC721的扩展,添加对多代币支持及批量转移功能,同时完全向后兼容,也称为ERC-721x)
- EIP-1155 (多元令牌标准,也称为ERC-1155)
- EIP-1376 (服务友好型代币,也称为ERC-1376)
- ST-20 - ST-20代币是基于以太坊,在ERC-20协议之上实现的令牌,它增加了令牌根据特定规则控制转移的能力
-
RLP编码
-
并发模式下的批量请求
-
Base58编码方案
-
Ethereum单位的格式转换
-
全面单元和集成测试覆盖
- Objective-C - 使用web3swift构建Objective-C DApp的代理桥接
- 完整文档 (https://web3swift.github.io/web3swift)
- 模块化,包括基本的Web3 subspec/SPM(例如交易签名和与http rpc服务器交互的最基本功能)以及其他具有附加功能的模块
- R-Token - 智能合约,用于对代币化证券发行和交易实施合规性
- 通过Infura公共IPFS网关支持IPFS
- 支持更多区块链 - Ripple, Bitcoin, EOS等。
- 性能改进
- 更便捷的基本命名空间方法
- 如果您需要 帮助,请提交一个问题。
- 如果您需要查找或了解API,请查看我们的文档。
- 如果您想了解使用此库的应用的最佳实践,请检查。
- 如果您发现了一个 错误,请提交一个问题。
- 如果您有一个 功能请求,请提交一个问题。
- 如果您想提交贡献,请提交一个Pull Request。
- 捐赠 我们以太坊钱包地址:0xe22b8979739d724343bd002f9f432f5990879901
如果您认为您发现了web3swift的安全漏洞,请尽快通过电子邮件报告给我们,电子邮件地址为[电子邮件地址保护中]。请不要将它发布到一个公开的问题跟踪器。
Matter Labs负责开源,并且不需要金钱来使用他们的web3swift库。我们希望继续尽我们所能推动事物向前发展。如果您在使用我们的任何库进行工作时,看看您的雇主是否会对捐赠感兴趣。您今天能提供的任何捐款都将帮助我们实现目标,我们将非常感激。
许可证
web3swift在Apache License 2.0许可证下可用。有关详情,请参阅LICENSE。