美文网首页
iOS Geth资源包的解析

iOS Geth资源包的解析

作者: 小朴同学 | 来源:发表于2019-02-18 10:50 被阅读18次

    Geth.framework 1.7.2版本 是用于iOS端的以太坊资源包,满足以太坊开发的基本环境配置。

    主要文件列表
    1. Geth.h文件
      一个资源文件集合。导入这个文件,就可以直接在其他地方使用相关的API

    2. 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:协议
    3. ref.h
      主要讲的就是GoSeqRef,GoSeqRef是一个用整数标记的对象,用于跨越语言边界来回传递。 GoSeqRef可以代表一个Go对象的实例,或者一个传递给Go的Objective-C对象。
      GoSeqRef的显式分配用于在传递给Objective-C时固定Go对象。 Go seq软件包在由refnum和引用计数键入的映射中维护对Go对象的引用。 当引用计数达到零时,Go seq软件包将清除地图中的相应条目。

    4. Universe.objc.h文件
      这是一个gobind生成的文件。用于与Go包交互的Objective-C API。
      生成命令参考:gobind -lang=objc
      主要的class就是Universeerror。感觉是一个对错误封装的对象。

    5. 实战

      // 创建文件夹
      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

    相关文章

      网友评论

          本文标题:iOS Geth资源包的解析

          本文链接:https://www.haomeiwen.com/subject/lvzgeqtx.html