内容简介:以太坊智能合约有各种各样的用例,但到目前为止,从你的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项目现在应该如下所示:
安装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应用程序如何调用以太坊智能合约
以上所述就是小编给大家介绍的《iOS应用程序如何调用以太坊智能合约》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective JavaScript
David Herman / Addison-Wesley Professional / 2012-12-6 / USD 39.99
"It's uncommon to have a programming language wonk who can speak in such comfortable and friendly language as David does. His walk through the syntax and semantics of JavaScript is both charming and h......一起来看看 《Effective JavaScript》 这本书的介绍吧!