iOS應用程序如何調用以太坊智能合約

以太坊智能合約有各類各樣的用例,但到目前爲止,從你的iOS應用程序中調用它們很是困難。不過若是使用以太坊iOS開發套件EtherKit,這種狀況會改善不少,你能夠當即開始使用。在本教程結束時,你將可以調用其ABI(應用程序二進制接口)中定義的任何公共合約函數。php

對於這個項目,咱們將使用Xcode 10.0和ContractCodegen 0.1。咱們還建議使用iOS MVVM項目模板,但爲了使本教程簡單,咱們將使用正常的iOS項目結構。java

首先,咱們將建立一個新的iOS項目,並將其稱爲EthereumContracts。在這裏下載咱們的示例合約abi.json文件。下載成功後,將文件拖到Xcode項目中。你的Xcode項目如今應該以下所示:node

安裝ContractCodegen

在本教程的下一部分中,咱們將從咱們的以太坊iOS開發工具包下載ContractCodegen。爲此,我將使用Cocoapods,它將自動下載必要的依賴項,但還有其餘方法可用,在以太坊iOS開發套件Github中有描述。python

在項目根目錄中建立Podfile並插入如下代碼:android

platform :ios, '10.3'
project 'EthereumContracts'

inhibit_all_warnings!
use_frameworks!

target 'EthereumContracts' do
   pod 'ContractCodegen', '~> x.y.z'
end

打開終端並粘貼此命令:ios

pod install

當此命令完成時,關閉咱們的EthereumContracts項目並在Finder中打開EthereumContracts.xcworkspacegit

很好!如今讓咱們生成Swift代碼以與咱們的智能合約進行交互。程序員

生成Swift代碼

首先,確保你在項目根目錄中。若是你已經在了,咱們能夠很是簡單地生成咱們的Swift代碼,只需使用如下命令:github

Pods/ContractCodegen/ContractCodegen/bin/contractgen HelloContract EthereumContracts/abi.json -x EthereumContracts.xcodeproj -o EthereumContracts/GeneraredContracts

當命令詢問你使用哪一個選項時,很是簡單,只使用一個,即第一個選項。web

瞧,若是你收到「Code generation: ok」的消息,你已經爲以太坊智能合約建立了第一個Swift代碼。

你如今應該看到一組Generated Contracts和其中的兩個文件:SharedContract.swiftHelloContract.swift。第一個幫助咱們調用合約文件中定義的各個方法(在咱們的例子中是HelloContract),而且對於全部生成的合約都是相同的。

有趣的那部分其實是使用咱們生成的代碼來調用咱們本身的合約。

建立密鑰

導航到咱們的ViewController並在文件頂部寫:

import EtherKit

如今咱們須要聲明咱們將使用哪一個geth網絡與智能合約進行通訊。爲了作到這一點,讓咱們在ViewController中定義一個屬性:

let query = EtherQuery(URL(string: "https://rinkeby.infura.io/v3/9f1a1e0782ab40c8b39fe189615714d0")!, connectionMode: .http)

你可使用任何所需的URL,你在字符串中看到的只是咱們爲你提供的URL。

而後咱們將繼續在viewDidLoad()函數中建立咱們的密鑰:

let walletStorage = KeychainStorageStrategy(identifier: "cz.ackee.etherkit.example")

HDKey.Private.create(
        	with: MnemonicStorageStrategy(walletStorage),
        	mnemonic: sentence,
        	network: .main,
        	path: [
            	KeyPathNode(at: 44, hardened: true),
            	KeyPathNode(at: 60, hardened: true),
            	KeyPathNode(at: 0, hardened: true),
            	KeyPathNode(at: 0),
            	]
    	)

這很簡單,對吧。

首先,咱們建立助記句,這句話用於建立私鑰和公鑰以及地址。要建立你本身的,這是很顯然的,你可使用今後處下載的MyCrypto錢包示例。而後,HDKey.Private.create建立咱們的主節點,從該節點派生全部其餘公鑰和私鑰以及地址。

如你所見,編譯器如今向咱們顯示此警告:

當咱們查看HDKey.Private.create的函數時,咱們能夠看到它有一個完成參數Result<HDKey.Private, EtherKitError>) -> Void。這是由於建立咱們的賬戶是異步操做,所以咱們須要在此功能完成後開始調用咱們的智能合約。

爲了使咱們的代碼簡單易讀,咱們將建立一個新函數,咱們將從中調用咱們的合約:

private func testContract() {

}

如今咱們從前面提到的完成中調用這個函數,以下所示:

HDKey.Private.create(
        	with: MnemonicStorageStrategy(walletStorage),
        	mnemonic: sentence,
        	network: .main,
        	path: [
            	KeyPathNode(at: 44, hardened: true),
            	KeyPathNode(at: 60, hardened: true),
            	KeyPathNode(at: 0, hardened: true),
            	KeyPathNode(at: 0),
            	]
    	) { [weak self] _ in
        	self?.testContract()
    	}

請耐心等待,咱們愈來愈接近最終結果。

調用咱們的合約

前往咱們以前建立的testContract()函數。首先,咱們須要使用關鍵路徑找到存儲在存儲中的一個建立的密鑰(下面的代碼只是經過樹到達特定位置):

let walletStorage = KeychainStorageStrategy(identifier: "cz.ackee.etherkit.example")
let key = HDKey.Private(walletStorage, network: .rinkeby, path: [
        	KeyPathNode(at: 44, hardened: true),
        	KeyPathNode(at: 60, hardened: true),
        	KeyPathNode(at: 0, hardened: true),
        	KeyPathNode(at: 1),
        	])

到代碼的最後部分,咱們差很少了!

let testContractAddress = try! Address(describing: "0xb8f016F3529b198b4a06574f3E9BDc04948ad852")
    	query.helloContract(at: testContractAddress).testString(greetString: "Greetings!").send(using: key, amount: Wei(10)).startWithResult { result in
        	switch result {
        	case .success(let hash):
            	print(hash)
            	print("Test greetings succeeded!")
        	case .failure(let error):
            	print(error)
            	print("Test greetings failed.")
        	}
    	}

好的,讓咱們看看這是作什麼的。

testContractAddress指向咱們建立的智能合約地址。要使用你本身的字符串替換它,請使用所需的十六進制代碼。

其他的代碼就是調用自己。我認爲這是很是自我描述的,但咱們將運行它,只是爲了清楚。

咱們找到全部的HelloContract函數,並聲明咱們要使用query.helloContract(at:testContractAddress)的合約地址。而後咱們選擇其中一個函數,在這個例子中我選擇了函數testString,它將String做爲輸入(這個值將由咱們的智能合約使用)。以後,咱們經過send發送此數據。密鑰值是咱們以前在存儲中找到的密鑰值,amount聲明瞭咱們想要發送多少以太坊(正如你所看到的,咱們爲UInt256使用了typealias以得到更好的可讀性)。而後send返回SignalProducer。若是你不知道那是什麼意思,請在ReactiveSwift文檔中閱讀更多相關信息。

若是調用成功,則返回Hash類型。這只是咱們發送的交易的哈希值。

讓咱們看看它是否有效!

嘗試運行應用程序,若是你在輸出中看到一個哈希和一個字符串「Test greetings succeeded!」,你剛剛使用Swift調用了你的第一個智能合約函數!

還有一件事應該說。智能功能有兩種類型:應付款和非應付款。這種差別由生成的智能合約代碼處理,所以你在代碼中將在這兩種類型之間看到的惟一區別是,當調用非應付函數時,將省略參數金額(由於不該發送以太坊)。很簡單,是吧?

若是想查看整個項目,能夠在此處下載

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

分享一些以太坊、EOS、比特幣等區塊鏈相關的交互式在線編程實戰教程:

  • java以太坊開發教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智能合約開發交互,進行帳號建立、交易、轉帳、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智能合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括帳戶管理、狀態與交易、智能合約開發與交互、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、帳戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • tendermint區塊鏈開發詳解,本課程適合但願使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操代碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。

匯智網原創翻譯,轉載請標明出處。這裏是原文iOS應用程序如何調用以太坊智能合約

相關文章
相關標籤/搜索