iOS Geth资源包的解析
Geth.framework 1.7.2版本 是用于iOS端的以太坊资源包,满足以太坊开发的基本环境配置。
主要文件列表
-
Geth.h文件
一个资源文件集合。导入这个文件,就可以直接在其他地方使用相关的API -
Geth.objc.h文件
主要API接口文件
这是一个gobind生成的文件。用于与github.com/ethereum/go-ethereum/mobile Go包交互的Objective-C API。
生成命令参考:gobind -lang=objc github.com/ethereum/go-ethereum/mobile- GethAccount:帐户代表一个存储的密钥
- GethAccounts:帐户是一个帐户数组的一部分(就是账号数组中的一个元素)
- GethAddress:地址就是以太坊帐户(以太坊账户是:20字节的地址)
- GethAddresses:地址数组
- GethBigInt:BigInt代表一个有符号的多精度整数
- GethBigInts:BigInt数组
- GethBlock:Block表示以太坊区块链中的整个区块
- GethBloom:Bloom表示一个256位布bloom过滤器
- GethBoundContract:调用带有参数的合约方法作为输入值并设置输出结果
- GethCallMsg:CallMsg包含合约调用的参数
- GethCallOpts:CallOpts是用于微调合同调用请求的选项集合
- GethContext:Context包含截止日期,取消信号以及跨越API边界的其他值
- GethEnode:Enode(Ethereum node)表示网络上的主机
- GethEnodes:主机数组操作对象
- GethEthereumClient:以太坊客户端提供对以太坊API的访问
- GethFilterQuery:FilterQuery包含合约日志筛选的选项
- GethHash:哈希表示任意数据的32字节Keccak256哈希
- GethHashes:哈希数组操作对象
- GethHeader:Header表示以太坊区块链中的区块Header
- GethHeaders:Header数组操作对象
- GethInterface:Interface表示Go的接口{}的封装版本,可以存储任意数据类型。由于无法在Go和移动平台之间转换任意性,因此我们使用显式的getter和setter来进行转换。枚举所有内容当然毫无意义,只需要支持需要客户端生成代码的合约bindins即可
- GethInterfaces:一个Interface数组操作对象
- GethKeyStore:KeyStore管理磁盘上的密钥存储目录。一个操作keyStore的对象
- GethLog:log代表合约日志事件。这些事件由LOG操作码生成并由节点存储/索引
- GethLogs:log数组操作对象
- GethNode:Node表示Geth以太坊节点实例
- GethNodeConfig:NodeConfig表示配置值的集合,用于微调嵌入到移动进程中的Geth节点。可用值是整个API提供的一个子集,用于减少维护表面和开发复杂性
- GethNodeInfo:NodeInfo代表主机已知信息的简短摘要
- GethNonce:Nonce是一个64位散列,证明(与混合散列结合),在块上进行了足够的计算量
- GethPeerInfo:PeerInfo表示对于连接的对等体已知的信息的简短摘要
- GethPeerInfos:远端peers的PeerInfo信息数组
- GethReceipt:收据表示交易的结果
- GethStrings:字符串代表了一些strs
- GethSubscription:订阅表示一个事件订阅,其中事件在数据通道上传递
- GethSyncProgress:当节点与以太坊网络同步时,SyncProgress会提供进度指示
- GethTopics:主题是用于过滤事件的一组主题列表
- GethTransactOpts:TransactOpts是创建有效以太坊交易所需的授权数据的集合
- GethTransaction:Transaction代表单一的以太坊交易
- GethTransactions:Transaction数据集合
- GethFilterLogsHandler:FilterLogsHandler是客户端订阅回调,用于调用事件和订阅失败。关于过滤日志的
- GethFilterLogsHandler:协议
- GethNewHeadHandler:NewHeadHandler是客户端订阅回调,用于调用事件和订阅失败。关于header的
- GethNewHeadHandler:协议
- GethSigner:签名者是定义回调的界面,当合同需要方法在提交之前签署交易时
- GethSigner:协议
-
ref.h
主要讲的就是GoSeqRef,GoSeqRef是一个用整数标记的对象,用于跨越语言边界来回传递。 GoSeqRef可以代表一个Go对象的实例,或者一个传递给Go的Objective-C对象。
GoSeqRef的显式分配用于在传递给Objective-C时固定Go对象。 Go seq软件包在由refnum和引用计数键入的映射中维护对Go对象的引用。 当引用计数达到零时,Go seq软件包将清除地图中的相应条目。 -
Universe.objc.h文件
这是一个gobind生成的文件。用于与Go包交互的Objective-C API。
生成命令参考:gobind -lang=objc
主要的class就是Universeerror。感觉是一个对错误封装的对象。 -
实战
// 创建文件夹 NSString *documentPath = [TCFileManager documentsDir]; NSString *keystorePath = [documentPath stringByAppendingPathComponent:@"keystore"]; NSString *dataPath = [documentPath stringByAppendingPathComponent:@"data"]; if (![TCFileManager isExistsAtPath:keystorePath]) { [TCFileManager createDirectoryAtPath:keystorePath]; } if (![TCFileManager isExistsAtPath:dataPath]) { [TCFileManager createDirectoryAtPath:dataPath]; } /* GethMainnetGenesis() *正式的以太坊* GethRinkebyGenesis() *Rinkeby测试网络* GethTestnetGenesis() *Ropsten测试网络* */ NSError *error; // 先创建一个节点配置 GethNodeConfig *nodeConfig = GethNewNodeConfig(); // 网络模式设置 nodeConfig.ethereumGenesis = GethRinkebyGenesis(); // 开启以太坊协议 nodeConfig.ethereumEnabled = YES; // 开启whisper协议 nodeConfig.whisperEnabled = YES; // 创建一个新的节点 GethNode *node = GethNewNode(dataPath, nodeConfig, &error); // 开启P2P网络 [node start:&error]; // 获得以太坊客户端 GethEthereumClient *client = [node getEthereumClient:&error]; // 以太坊同步进程信息 GethSyncProgress *syncProgress = [client syncProgress:GethNewContext() error:&error]; NSLog(@"getCurrentBlock%lld", syncProgress.getCurrentBlock); // 为0,没有获得最新的块信息,感觉没有进行数据同步 // 获得某个位置的块 GethBlock *block = [client getBlockByNumber:GethNewContext() number:0 error:nil]; NSLog(@"getHash>>%@", block.getHash.getHex); // 这个块的hash值 // keystore账户地址管理 GethKeyStore *keyStore = GethNewKeyStore(keystorePath, GethLightScryptN, GethLightScryptP); // 先保证有一个账号 if (keyStore.getAccounts.size == 0) { // 创建新的账户 GethAccount *accout = [keyStore newAccount:@"abc123456789" error:&error]; // 地址 NSLog(@"第一个getAddress>>%@", accout.getAddress.getHex); } // 从本地文件中恢复一个账号 NSString *fileName = [TCFileManager listFilesInDirectoryAtPath:keystorePath deep:NO][0]; NSString *getKeyStorePath = [keystorePath stringByAppendingPathComponent:fileName]; /* 从本地的keystore文件夹下找到文件,从这个文件中找到一个账号 passphrase:这个文件生成时,这个账号的密码 newPassphrase:恢复后这个账号可以设置一个新的密码 */ GethAccount *otherAccount = [keyStore importKey:[NSData dataWithContentsOfFile:getKeyStorePath] passphrase:@"abc123456789" newPassphrase:@"abc123456789" error:&error]; // 回复的账户地址和第一次创建的账户地址相同 NSLog(@"getAddress>>%@", otherAccount.getAddress.getHex); // 查询当前地址的余额,number:-1,当值小于0,查询会从最新地址获取 GethBigInt *bigInt = [client getBalanceAt:GethNewContext() account:otherAccount.getAddress number:-1 error:&error]; NSLog(@"余额为:%@", bigInt.string); // 由于数据没有同步,所以余额为0
参考资料
Mobile: Introduction
Mobile: Account management
Ethereum on a iPhone
Package geth contains the simplified mobile APIs to go-ethereum.
Introduction of the Light Client for DApp developers