當前位置:
首頁 > 知識 > Swift編寫的EOS區塊鏈開源框架SwiftyEOS

Swift編寫的EOS區塊鏈開源框架SwiftyEOS

SwiftyEOS是一個用於與EOS交互的開源框架,用Swift編寫。可以在iOS和macOS上使用。

特點:

  • EOS密鑰對生成
  • 私鑰導入
  • 簽名哈希
  • 基本的RPC API(鏈/歷史)可查詢客戶端
  • 交易(EOS token 轉賬)
  • 幫助類處理iOS上的離線錢包
  • 在iOS上加密/解密導入私鑰

如何使用它

  • 1.將Libraries和Sources文件夾複製到項目中,不需要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密鑰對。

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!)

RPC API

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

目前我們有一些基本的RPC端點,你可以在Sources/SwiftyEOS/Network找到它。

iOS的密鑰存儲

我們有SEWallet.swift iOS版離線錢包管理助手。

SEWallet.swift可以方便地保存AES加密的密鑰信息到文件系統。默認位置是應用程序的沙盒。

目前還不支持多個錢包管理。

在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上的設備上(離線)錢包鎖定和解鎖

我們添加lock和timedUnlock函數到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的幫助方法。

謝謝。

Swift編寫的EOS區塊鏈開源框架SwiftyEOS

打開今日頭條,查看更多精彩圖片

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

L1歸一化和L2歸一化範數的詳解和區別
「設計模式專題」Singleton

TAG:程序員小新人學習 |