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应用程序如何调用以太坊智能合约
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
树莓派上利用Tensorflow实现小车的自动驾驶
先抛出大家最关心的——代码地址: github传送门:https://github.com/Timthony/self_drive 码云传送门:https://gitee.com/tiantianhang/self_drive 基于树莓派的人工智能自动驾驶小车 # 整体流程 电机控制 摄像头调试 道路数据采集 搭建深度学习模型,参数调试 自动驾驶真实道路模拟 参数最终调试 使用方法: 1. 先将树莓派小车硬件组装好 2. 使用zth_car_control.py来控制小车的前后左右移动,配合zth_collect_data.py来人工操作,使小车在自己制作的跑道进行数据采集。(该过程在树莓派进行) 3. 数据采集完成以后使用zth_process_img.py来对采集的数据进行处理,之前当前先完成一些数据清洗的工作。(电脑上执行) 4. 使用神经网络模型对数据进行训练zth_train.py,得到训练好的模型。(电脑上执行) 5. 在树莓派小车上使用zth_drive和训练好的模型,载入模型,即可实现在原先跑道的自动驾驶。(树莓派上执行) 注意:只需要使...
- 下一篇
Electrum比特币钱包的Python代码分析
如果你仍然未对Python语言的强大功能感到惊讶,那么在这部分我们将学习如何在python中开发比特币地址或钱包。我只是想说与你的计算机通信是多么容易,如果你通过python和Linux操作系统,可以用它做多少有趣的项目。 在本文中,我将分析Electrum的源代码,这是纯粹用Python编写的比特币钱包,它应该适用于任何python 2.x,我相信即使使用python 3.x包,默认情况下,所有依赖项该软件使用的是默认包。因此,不需要额外的软件。 免责声明:使用此代码和信息需要你自担风险,对于因使用修改后的代码而导致的任何损害,以及本文中提供的信息,我概不负责。如果你不知道自己在做什么,建议不要修改生成私钥的代码! 了解代码 我从Github下载了最新版本的Electrum源代码: https://github.com/spesmilo/electrum/releases/tag/2.8.3 种子生成器文件基本上位于lib中,它名为mnemonic.py,函数是make_seed(),它是这段代码: 你也可以通过内部命令从终端实际调用。所以,如果你安装了Electrum,那么它是这样...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19