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调用了你的第一个智能合约函数!

还有一件事应该说。智能功能有两种类型:应付款和非应付款。这种差别由生成的智能合约代码处理,所以你在代码中将在这两种类型之间看到的惟一区别是,当调用非应付函数时,将省略参数金额(由于不该发送以太坊)。很简单,是吧?

若是想查看整个项目,能够在此处下载

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

分享一些以太坊区块链相关的交互式在线编程实战教程:

  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行帐号建立、交易、转帐、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括帐户管理、状态与交易、智能合约开发与交互、过滤器和交易等。

这里是原文iOS应用程序如何调用以太坊智能合约

相关文章
相关标签/搜索