主页 > imtoken钱包ios下载 > iOS 应用如何调用以太坊智能合约

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

imtoken钱包ios下载 2023-08-11 05:11:15

以太坊智能合约有各种各样的用例,但到目前为止,从您的 iOS 应用程序调用它们非常困难。 但是有了 Ethereum iOS Development Kit 和 EtherKit,情况有了很大改善,你可以马上开始使用它。 在本教程结束时,您将能够调用其 ABI(应用程序二进制接口)中定义的任何公共合约函数。

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

首先,我们将创建一个新的 iOS 项目并将其命名为 EthereumContracts。 在此处下载我们的示例合约 abi.json 文件。 下载成功后,将文件拖入Xcode工程中。 您的 Xcode 项目现在应该如下所示:

什么是以太坊智能合约_以太坊智能合约语言_以太坊智能合约的应用

安装 ContractCodegen

在本教程的下一部分,我们将从我们的以太坊 iOS SDK 下载 ContractCodegen。 为此,我将使用 Cocoapods,它会自动下载必要的依赖项,但还有其他方法可用,如 Ethereum iOS Dev Kit 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

当命令询问你使用哪个选项时,很简单,使用一个即可,第一个选项。

瞧,如果你收到“代码生成:ok”消息,你已经为以太坊智能合约创建了你的第一个 Swift 代码。

您现在应该看到一组生成的合同和其中的两个文件:SharedContract.swift 和 HelloContract.swift。 第一个帮助我们调用合同文件中定义的各个方法(在我们的例子中是 HelloContract),并且对于所有生成的合同都是相同的。

有趣的部分实际上是使用我们生成的代码来调用我们自己的合约。

创建密钥

导航到我们的 ViewController 并在文件顶部写入:

import EtherKit

现在我们需要声明我们将使用哪个 geth 网络与智能合约进行通信。 为此,让我们在 ViewController 中定义一个属性:

let query = EtherQuery(URL(string: "https://rinkeby.infura.io/v3/9f1a1e0782ab40c8b39fe189615714d0")!, connectionMode: .http)

您可以使用任何您想要的 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) -> 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,它接受一个字符串作为输入(这个值将被我们的智能合约使用)。 之后,我们通过 send 发送这些数据。 键值是我们之前在存储中找到的键值,数量声明了我们要发送多少以太币(如您所见,我们为 UInt256 使用了类型别名以提高可读性)。 然后发送返回 SignalProducer。 如果您不知道这意味着什么,请在 ReactiveSwift 文档中阅读更多相关信息。

如果调用成功,则返回 Hash 类型。 这只是我们发送的交易的哈希值。

让我们看看它是否有效!

尝试运行应用程序以太坊智能合约的应用,如果您看到哈希和字符串“测试问候成功!” 在输出中,您刚刚使用 Swift 调用了您的第一个智能合约函数!

还应该说一件事。 智能功能有两种类型:应付款和非应付款。 这种差异由生成的智能合约代码处理,因此您将在两种类型的代码中看到的唯一区别是调用非支付函数时,参数金额将被省略(因为不应发送以太币)。 这很容易,不是吗?

如果您想查看整个项目,可以在此处下载。

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

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