SwiftyEOS是一个用于与EOS交互的开源框架,用Swift编写。可以在iOS和macOS上使用。
特点:
Libraries
和Sources
文件夹复制到项目中,不需要main.swift
。Sources/Utils/iOS
。Libraries/include
添加到Header搜索路径中。Libraries/include/Bridging-Header.h
设置为Objective-C Bridging Header。如果你有自己的bridging header,请复制该文件中的所有导入内容并粘贴到你自己的文件中。SwiftyEOS现在支持secp256k1密钥对。
secp256r1密钥对生成有bug但我无法弄清楚原因。从cleos
创建的单元测试创建密钥--r1
不会通过。你可能不会将secp256r1视为一个选项,因为cleos wallet
命令也无法导入这些键。
let (pk, pub) = generateRandomKeyPair(enclave: .Secp256k1)
很容易对吧?
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!)
带分隔符和前缀:
let importedPk = try PrivateKey(keyString: "PVT_K1_5HxrYTdZX89zodtJhTzCk87MfNZAkiBRfFvSX8kacYjtwaDpTkL")
let importedPub = PublicKey(privateKey: importedPk!)
EOSRPC.sharedInstance.chainInfo { (chainInfo, error) in
if error == nil {
print("Success: \(chainInfo!)")
} else {
print("Error: \(error!.localizedDescription)")
}
}
目前我们有一些基本的RPC端点,你可以在Sources/SwiftyEOS/Network
找到它。
我们有SEWallet.swift
iOS版离线钱包管理助手。
SEWallet.swift
可以方便地保存AES加密的密钥信息到文件系统。默认位置是应用程序的沙盒。
目前还不支持多个钱包管理。
在Objective-C中:
[SEKeystoreService.sharedInstance newAccountWithPasscode:passcode succeed:^(SELocalAccount *account) {
} failed:^(NSError *error) {
}];
[SELocalAccount currentAccount];
如果没有保存钱包,它将返回零。
交易行为目前尚未完全支持,但你仍可以尝试使用main.swift
中的示例代码。
整个功能完成后,将提供相关文件。
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) {
}];
我们添加lock
和timedUnlock
函数到SELocalAccount
。
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的帮助方法。
谢谢。