imToken 是一款全球领先的区块链数字资产管理工具[ZB],帮助你安全管理BTC, ETH, ATOM, EOS, TRX, CKB, BCH, LTC, DOT, KSM, FIL, XTZ 资产,同时支持去中心化币币兑换功能 ...
✓
✓
✓
✓
工业控制计算机
✓
✓
✓
WS
✓
✓
合约调用
当然,在Trust的iOS端,是通过JSON RPC Over HTTP来调用智能合约的,对于项目中的合约调用请求,网络层是采用+的方式设计的。
通过 HTTP 进行 JSON RPC
项目中以太坊智能合约调用都是采用 JSON RPC Over HTTP 的形式,使用的以太坊节点在上一篇文章网络层中有提到。
var remoteURL: URL {
let urlString: String = {
switch self {
case .main: return "https://api.trustwalletapp.com"
case .classic: return "https://classic.trustwalletapp.com"
case .callisto: return "https://callisto.trustwalletapp.com"
case .poa: return "https://poa.trustwalletapp.com"
case .gochain: return "https://gochain.trustwalletapp.com"
}
}()
return URL(string: urlString)!
}
网络层结构应该如下图所示:
理解了这个网络结构之后,我们再来看 Trust 中统一命名封装的应用组件。它定义了 、 、 等的转换。这里是调用以太坊智能合约的接口名。在项目中,使用统一命名按照功能对请求组件进行封装。当然没有这一层抽象的 HTTP 请求也是可以的。
下图中imToken钱包官网,Trust涉及到一些API:,,,,,Hash,,。下面详细列出了项目中合约调用的类,以及具体用到的以太坊API,它们是一一对应的。
Web3.swift
Trust 项目并没有使用 web3 的方式进行合约调用,但我还是想说一下这个方式。这是因为除了以太坊官方提供的用于 API 的 web3 库之外,还有一个用纯 Swift 编写的库,Web3.swift。它可以用来在以太坊网络中签署交易并与智能合约交互,并且可以直接在你的 iOS 客户端中使用。如果你的网络层换成 Web3.swift+,网络层结构的复杂性就会降低,代码的简洁性也会提高。
其他网络层请求
在 Trust 中,获取区块链上的数据其实有两种方式,一种是如上文提到的直接通过智能合约获取的数据,另一种是 Trust 官网已经封装好的一些接口,是多种币种的,大部分都需要在区块链上找,接口不单一,工作量大,比如 等。这些接口都是直接使用网络库 Moya 封装好的,没有调用智能合约。这些 HTTP 请求的服务器是:
let trustAPI = URL(string: "https://public.trustwalletapp.com")
这些接口在类中被明确列出,并被集体封装在类中进行管理。
至此,上一篇文章遗留的网络层细节已经完成。
贸易
交易,也就是转账交易。上面我们简单介绍了以太坊上的交易,也了解到了交易API的开启。下面就来介绍一下项目中转账交易的结构,以及原生App和DApp中转账交易的流程。
交易结构
在项目的主目录中,有一个模块,它的主要功能是处理转账交易。在形成一笔交易之前,会基于定义的类封装一个结构体,这个结构体包含了发送地址,接收地址,币数,交易手续费等所有与交易相关的数据。最后定义tor类,进行交易最外层的业务管理和验证。交易在tor中验证并签名后会发送到以太坊节点,当矿工挖矿并将交易放入区块时,当前代币的转移就完成了。
主要包含当前转账发起方token相关的一些数据,比如地址,合约等,并且有三种类型,分别是Coin,ERC20,Dapp,前两种是原生App方式,后者是浏览器中的DApp方式。
在
On主要包含了当前Token的一些信息,也就是还有转账接收者的信息,比如地址,币数,交易手续费,Data等。
托尔
tor类进行最外层的业务管理和交易的验证,包含了全额的on数据,同时还具备验证余额是否有效,交易手续费,交易限制等功能,最终生成一个完整验证过的token。
该类只有在DApp进行转账交易的时候才会用到。以上三个交易结构类无论是原生App还是DApp都需要。从浏览器传进来的消息会被解析,获取其他数据并封装在里面,然后和浏览器的网页标题、URL等元素一起生成,最后这两个联合生成,确定需要进行哪些操作,需要调用合约中的哪些API,以及一些交易数据。
交易结构图
交易流程
交易流程自然分为两个部分:一个是原生App中发起的交易,一个是DApp在浏览器中发起的交易。上文提到的交易结构将会是数据形式呈现的重要部分。这里我们主要讲解从交易发起到交易完成的主要流程,以及需要调用哪些以太坊智能合约API。
本机应用程序发起的交易
发起交易。在原生App钱包首页,有当前账户下的币种列表,发起的转账交易是以具体的币种进行操作的。所以当前的已经是可用的,具体的交易接收地址,币种数量,gas费需要用户在模块中输入。
构建交易数据。交易发起后,我们就有了构建和 tor 所需的所有数据。它们的具体情况之前已经讲解过了,这里就不再赘述了。tor 构建完成后,进入流程中的模块,该模块允许用户确认交易详情,并验证当前 token 余额是否足够。
智能合约调用。当用户确认并且余额足以支持转账时Trust钱包如何使用DApp,需要进行核心的转账交易业务,因此是没有页面的纯业务功能类。此时需要根据tor中的验证判断nonce是否大于0,如果不大于0,需要通过JSON RPC Over HTTP调用以太坊智能合约API,即Hash更新nonce,然后重新判断;如果大于0,则对交易进行签名,然后通过JSON RPC Over HTTP调用以太坊智能合约API,即开启。
交易回调处理。交易结果产生后,需要回调给发起模块,处理后续业务。如果交易成功,会将交易保存到本地 Realm 数据库等;如果交易失败,则会提示用户交易失败。
至此,转账交易流程闭环完成。下图也总结了整个交易流程。
DApp 发起的交易
Trust 拥有功能齐全的 Web3 浏览器,可以与任何分布式应用程序(DApp)配合使用。此场景是在 DApp 中发起转账交易时。整体交易流程与原生 App 中基本一致,交易核心数据结构相同。区别在于 DApp 中的发起方式、回调处理,以及更多的解析流程。
交易发起。在Web3浏览器的DApp中,通过JS调用iOS原生函数发起转账交易,通过传入的数据在模块中进行解析。
解析。解析是通过、、等类完成的,完成后封装好判断需要执行哪些操作,调用合约中的哪些API。其有6个响应事件,分别是:
构造交易数据,调用智能合约。这两个步骤和原生基本一致,都是通过数据构造,用于为交易做准备,然后进行验证,调用智能合约,因此就不详细讲解了,请参考原生App。
交易回调处理。交易结果产生后,也会回调给发起模块,处理后续业务。这里的区别在于,除了成功或失败时完成原生App已经完成的流程外,还需要将交易结果再次通知给Web,从而形成一个完整的闭环。因此,无论回调结果如何,Web交易的具体情况都会由iOS原生调用JS来通知。
交易流程图
Trust 项目到这里基本就讲清楚了。虽然这两篇文章只是对 Trust 的解读,非常有限。但是从中可以延伸出的知识,比如以太坊智能合约的知识、钱包和私钥管理的知识等等,以及你对区块链的理解,都不算狭隘。所以无论你觉得区块链是好是坏,也无论它是否有实际应用和市场认可度,这项技术都带来了无限的创新。
相关信息
以太坊钱包信托项目解读:架构与流程
了解 Trust 的以太坊钱包管理和智能合约
欢迎指正。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。