iOS應用程式如何呼叫以太坊智慧合約
以太坊智慧合約有各種各樣的用例,但到目前為止,從你的iOS應用程式中呼叫它們非常困難。不過如果使用以太坊iOS開發套件和EtherKit,這種情況會改善很多,你可以立即開始使用。在本教程結束時,你將能夠呼叫其ABI(應用程式二進位制介面)中定義的任何公共合約函式。
對於這個專案,我們將使用Xcode 10.0和ContractCodegen 0.1。我們還建議使用iOS MVVM專案模板,但為了使本教程簡單,我們將使用正常的iOS專案結構。
首先,我們將建立一個新的iOS專案,並將其稱為EthereumContracts
。在這裡下載我們的示例合約abi.json
檔案。下載成功後,將檔案拖到Xcode專案中。你的Xcode專案現在應該如下所示:
安裝ContractCodegen
在本教程的下一部分中,我們將從我們的以太坊iOS開發工具包下載ContractCodegen。為此,我將使用Cocoapods,它將自動下載必要的依賴項,但還有其他方法可用,在以太坊iOS開發套件Github中有描述。
在專案根目錄中建立Podfile並插入以下程式碼:
platform :ios, '10.3' project 'EthereumContracts' inhibit_all_warnings! use_frameworks! target 'EthereumContracts' do pod 'ContractCodegen', '~> x.y.z' end
開啟終端並貼上此命令:
pod install
當此命令完成時,關閉我們的EthereumContracts
專案並在Finder中開啟EthereumContracts.xcworkspace
。
很好!現在讓我們生成Swift程式碼以與我們的智慧合約進行互動。
生成Swift程式碼
首先,確保你在專案根目錄中。如果你已經在了,我們可以非常簡單地生成我們的Swift程式碼,只需使用以下命令:
Pods/ContractCodegen/ContractCodegen/bin/contractgen HelloContract EthereumContracts/abi.json -x EthereumContracts.xcodeproj -o EthereumContracts/GeneraredContracts
當命令詢問你使用哪個選項時,非常簡單,只使用一個,即第一個選項。
瞧,如果你收到“Code generation: ok”的訊息,你已經為以太坊智慧合約建立了第一個Swift程式碼。
你現在應該看到一組Generated Contracts
和其中的兩個檔案:SharedContract.swift
和HelloContract.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應用程式如何呼叫以太坊智慧合約