Swift编写的EOS区块链开源框架SwiftyEOS

SwiftyEOS是一个用于与EOS交互的开源框架,用Swift编写。能够在iOS和macOS上使用。php

特色:java

  • EOS密钥对生成
  • 私钥导入
  • 签名哈希
  • 基本的RPC API(链/历史)可查询客户端
  • 交易(EOS token 转帐)
  • 帮助类处理iOS上的脱机钱包
  • 在iOS上加密/解密导入私钥

如何使用它

  • 1.将LibrariesSources文件夹复制到项目中,不须要main.swift
  • 2.若是不是针对iOS平台,请删除Sources/Utils/iOS
  • 3.将Libraries/include添加到Header搜索路径中。
  • 4.将Libraries/include/Bridging-Header.h设置为Objective-C Bridging Header。若是你有本身的bridging header,请复制该文件中的全部导入内容并粘贴到你本身的文件中。
  • 5.编译而后等结果

密钥对生成

SwiftyEOS如今支持secp256k1密钥对。node

secp256r1密钥对生成有bug但我没法弄清楚缘由。从cleos建立的单元测试建立密钥--r1不会经过。你可能不会将secp256r1视为一个选项,由于cleos wallet命令也没法导入这些键。python

生成随机密钥对:

let (pk, pub) = generateRandomKeyPair(enclave: .Secp256k1)

很容易对吧?android

print("private key: \(pk!.wif())")
print("public key : \(pub!.wif())")

// private key: PVT_K1_5HxrYTdZX89zodtJhTzCk87MfNZAkiBRfFvSX8kacYjtwaDpTkL
// public key : PUB_K1_4yDYdmcVcXxAxeNsUWRG7x9FKQE4HbJZdzgZFv1AYxk6oSVcLd

PVT_K1_PUB_K1_前缀是标准密钥表示的一部分。可是EOS系统和SwiftyEOS也支持旧方式:程序员

print("private key: \(pk!.rawPrivateKey())")
print("public key : \(pub!.rawPublicKey())")

// private key: 5HxrYTdZX89zodtJhTzCk87MfNZAkiBRfFvSX8kacYjtwaDpTkL
// public key : EOS4yDYdmcVcXxAxeNsUWRG7x9FKQE4HbJZdzgZFv1AYxk6oSVcLd

导入现有密钥:

let importedPk = try PrivateKey(keyString: "5HxrYTdZX89zodtJhTzCk87MfNZAkiBRfFvSX8kacYjtwaDpTkL")
let importedPub = PublicKey(privateKey: importedPk!)

带分隔符和前缀:web

let importedPk = try PrivateKey(keyString: "PVT_K1_5HxrYTdZX89zodtJhTzCk87MfNZAkiBRfFvSX8kacYjtwaDpTkL")
let importedPub = PublicKey(privateKey: importedPk!)

RPC API

EOSRPC.sharedInstance.chainInfo { (chainInfo, error) in
    if error == nil {
        print("Success: \(chainInfo!)")
    } else {
        print("Error: \(error!.localizedDescription)")
    }
}

目前咱们有一些基本的RPC端点,你能够在Sources/SwiftyEOS/Network找到它。mongodb

iOS的密钥存储

咱们有SEWallet.swift iOS版离线钱包管理助手。编程

SEWallet.swift能够方便地保存AES加密的密钥信息到文件系统。默认位置是应用程序的沙盒。json

目前还不支持多个钱包管理。

在iOS上建立新钱包

在Objective-C中:

[SEKeystoreService.sharedInstance newAccountWithPasscode:passcode succeed:^(SELocalAccount *account) {
} failed:^(NSError *error) {
        
}];

检索已保存的钱包

[SELocalAccount currentAccount];

若是没有保存钱包,它将返回零。

交易

交易行为目前还没有彻底支持,但你仍能够尝试使用main.swift中的示例代码。

整个功能完成后,将提供相关文件。

  • 货币转帐(2018.08.15)
  • 提交通常交易(2018.08.16)
  • iOS上的设备上(离线)钱包锁定和解锁(2018.08.17)
  • 押注/取消押注/净值(2018.08.28)
  • 买/卖ram(2018.08.28)
  • 建立帐户(2018.10)
  • 用params列表推送交易(2018.11.05)
  • 使用助记符建立/导入密钥对

货币转帐

var transfer = Transfer()
transfer.from = "agoodaccount"
transfer.to = "gq3dinztgage"
transfer.quantity = "1.0000 EOS"
transfer.memo = "eureka"

Currency.transferCurrency(transfer: transfer, code: "eosio.token", privateKey: importedPk!, completion: { (result, error) in
    if error != nil {
        if error is RPCErrorResponse {
            print("\((error as! RPCErrorResponse).errorDescription())")
        } else {
            print("other error: \(String(describing: error?.localizedDescription))")
        }
    } else {
        print("done.")
    }
})

提交通常交易

swift:

let account = "raoji"
let asset = "1.0000 EPRA"

let data = "{\"hey\": {\"account\":\"" + account  + "\", \"quantity\":\"" + asset + "\"}}"
let abi = try! AbiJson(code: "prabox1", action: "withdraw", json: data)

TransactionUtil.pushTransaction(abi: abi, account: account, privateKey: importedPk!, completion: { (result, error) in
    if error != nil {
        if (error! as NSError).code == RPCErrorResponse.ErrorCode {
            print("\(((error! as NSError).userInfo[RPCErrorResponse.ErrorKey] as! RPCErrorResponse).errorDescription())")
        } else {
            print("other error: \(String(describing: error?.localizedDescription))")
        }
    } else {
        print("Ok. Txid: \(result!.transactionId)")
    }
})

Objective-C:

AbiJson *your_abi;
[TransactionUtil pushTransactionWithAbi:your_abi
                                account:@"your_account"
                               pkString:@"your_private_key"
                             completion:^(TransactionResult *result, NSError *error) {
        
}];

iOS上的设备上(离线)钱包锁定和解锁

咱们添加locktimedUnlock函数到SELocalAccount

Cpu/net/ram 操做

ResourceUtil.swift文件包括ResourceUtil类,包括下面几个方法:

  • stakeResource
  • unstakeResource
  • buyRam
  • sellRam

Stake resource:

ResourceUtil.stakeResource(account: "raoji", net: 1.0, cpu: 1.0, pkString: "5HsaHvRCPrjU3yhapB5rLRyuKHuFTsziidA13Uw6WnQTeJAG3t4", completion: { (result, error) in
})

助记符

建一个新的密钥对:

let (pk, pub, mn) = generateRandomKeyPair(enclave: .Secp256k1)

导入现有助记符:

let (pk, mn) = PrivateKey(enclave: .Secp256k1, mnemonicString: "your words here")

咱们在SEWallet.swift中有密钥管理的iOS助手API和助记符。如今可使用SEKeystoreService类建立和导入助记符(若是你本身存储,则可使用SEKeystore更深刻的API):

SEKeystoreService.sharedInstance.newAccountAndMnemonic(passcode: "your pass here", succeed: { (account, mnemonic) in

}) { (error) in

}

咱们正在为全部顶级API使用NSObject固有类,所以在不提供额外桥接文件的状况下调用Objective-C也是同样的。

SEWallet.swift文件中也有iOS的帮助方法。

谢谢。

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、帐户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行帐号建立、交易、转帐、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括帐户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如建立地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如建立地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合但愿使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文Swift编写的EOS开源框架SwiftyEOS

相关文章
相关标签/搜索