Swift編寫的EOS開源框架SwiftyEOS

tualala發表於2018-11-28

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

特點:

  • 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金鑰對。

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

我們新增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

相關文章