iOS应用程序如何调用以太坊智能合约

栏目: IOS · 发布时间: 5年前

内容简介:以太坊智能合约有各种各样的用例,但到目前为止,从你的iOS应用程序中调用它们非常困难。不过如果使用以太坊iOS开发套件和EtherKit,这种情况会改善很多,你可以立即开始使用。在本教程结束时,你将能够调用其ABI(应用程序二进制接口)中定义的任何公共合约函数。对于这个项目,我们将使用Xcode 10.0和ContractCodegen 0.1。我们还建议使用iOS MVVM项目模板,但为了使本教程简单,我们将使用正常的iOS项目结构。首先,我们将创建一个新的iOS项目,并将其称为

以太坊智能合约有各种各样的用例,但到目前为止,从你的iOS应用程序中调用它们非常困难。不过如果使用以太坊iOS开发套件和EtherKit,这种情况会改善很多,你可以立即开始使用。在本教程结束时,你将能够调用其ABI(应用程序二进制接口)中定义的任何公共合约函数。

对于这个项目,我们将使用Xcode 10.0和ContractCodegen 0.1。我们还建议使用iOS MVVM项目模板,但为了使本教程简单,我们将使用正常的iOS项目结构。

首先,我们将创建一个新的iOS项目,并将其称为 EthereumContracts 。在这里下载我们的示例合约 abi.json 文件。下载成功后,将文件拖到Xcode项目中。你的Xcode项目现在应该如下所示:

iOS应用程序如何调用以太坊智能合约

安装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.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 创建我们的主节点,从该节点派生所有其他公钥和私钥以及地址。

如你所见,编译器现在向我们显示此警告:

iOS应用程序如何调用以太坊智能合约

当我们查看 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应用程序如何调用以太坊智能合约


以上所述就是小编给大家介绍的《iOS应用程序如何调用以太坊智能合约》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

失业的程序员

失业的程序员

沈逸 / 2014-5-1 / 39.00元

这是一个程序员从失业到自行创业的奋斗历程,虽然囧事连连、过程曲折,却充满了趣味。本书以作者的真实创业经历为主线,文字幽默诙谐,情节生动真实,包括了招聘、团队管理和用户公关,以及技术架构设计、核心代码编写、商务谈判、项目运作等场景经验。 从初期的创业伙伴、领路人,到商业竞争对手,各种复杂的关系在各个关键时刻却都发生了意想不到的逆转。在历经千辛万苦,眼看快要成功时,主人公却几乎再次失业。 ......一起来看看 《失业的程序员》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具