Pocket IOS AION插件
AION IOS插件,用于连接任何与AION兼容的Pocket节点。有关Pocket节点的更多信息,您可以在此处查看仓库:这里。
安装
需要在Podfile中安装以下pod
pod 'PocketAion', '~> 0.0.14'
关于此插件
此插件允许您的应用程序向支持AION网络的所有给定Pocket节点发送Transaction
和Query
对象。
Transaction
是指任何更改网络状态的调用:将AION从一个账户发送到另一个账户,调用智能合约等。
Query
是指任何从当前网络状态读取数据的调用:获取账户余额,从智能合约中读取等。
子网络注意事项
在贫困网络术语中,任何给定的并行网络都是一个去中心化系统,例如在AION的情况下,除了主网络(子网络256
)之外,您还可以访问精通测试网络(子网络32
)。在连接到自定义网络的情况下,请确保您要连接的贫困节点支持给定的子网络。
这有助于用户在不同的网络之间切换,或者用于建立应用程序测试环境和生产环境之间的差异。
使用贫困Ios插件
只需导入PocketAion
类并调用以下描述的任何函数。此外,您还可以使用以下函数将创建的Transaction
和Query
对象异步或同步地发送到您的配置贫困节点。
配置对象
任何给定的PocketAion
实例的构造函数需要一个实现Configuration
接口的类。让我们看一下下面的例子
1- 在您的appDelegate
中导入Pocket
和PocketAion
2- 将Configuration
协议添加到类中:class AppDelegate: UIResponder, UIApplicationDelegate, Configuration, {
3- 实现nodeURL
与节点URL:var nodeURL: URL { get { return URL.init(string: "https://aion.pokt.network")! } }
4- 在指定了URL之后,我们需要在Application
函数中设置贫困的configuration
:Pocket.shared.setConfiguration(config: self)
创建和导入钱包
遵循下面的例子来创建一个AION钱包
let wallet = try PocketAion.createWallet(subnetwork: subnetwork, data: nil)
导入时,需要定义
1- 公钥
2- 私钥
3- 子网络
4- 数据
let privateKey = "0x";
let address = "0x";
let subnetwork = "32";
var importedWallet = try PocketAion.importWallet(privateKey: privateKey, subnetwork: subnetwork, address: address, data: nil)
发送交易
发送交易的要求需要定义:
1- 子网络:256(主网络),32(精通测试网)。2- 随机数:钱包交易计数。3- 钱包:通过创建新的钱包或导入钱包。4- 发往:我们想要发送资金的地址。5- 价值:我们想要发送的AION数量。6- 数据(可选):交易中的十六进制编码数据(如果发送到智能合约)或发送到钱包的原始数据。7- NRG(能量):我们愿意在此交易中执行的总体计算步骤。8- NRG价格(能量价格)
要发送交易,请使用 eth
命名空间中的 sendTransaction
函数,如下例所示
try? PocketAion.eth.sendTransaction(wallet: account, nonce: BigInt(1), to: "0x0", data: "", value: BigInt.init(20000000000), gasPrice: BigInt(10000000000), gas: BigInt(21000)) { (result, error) in
// Result is the transaction hash
}
查询数据
PocketAION当前支持两个命名空间:net
和 eth
,它们包含在执行每个命名空间时调用的预构建 RPC Methods
。在下面的示例中,您将了解如何使用这两个命名空间之一获取钱包余额。
try? PocketAion.eth.getBalance(address: "0x0...", subnetwork: "32", blockTag: BlockTag.init(block: .LATEST), handler: { (result, error) in
// result is returned as a BigInt, also can be converted using the .toString() function
// error if any contains a description of the error, returned by the Pocket Node
})
与智能合约交互
在与智能合约交互之前。我们还需要初始化一个 AionContract 类
的实例,需要指定4个参数
1- PocketAION实例
2- 智能合约的ABI
3- 合约地址
4- 子网络
初始化 AionContract 实例
以下是如何初始化您的 AionContract
的示例
let pocketAion = PocketAion.init()
let contractAddress = "0x0..."
guard let contractABI = JSON.init(parseJSON: "[...]").array else {
// if there was an error parsing the JSON array
throw PocketPluginError.Aion.executionError("Failed to retrieve JSON ABI")
return nil
}
// Finally initialize your AionContract
let aionContract = try AionContract.init(pocketAion: pocketAion, abiDefinition: contractABI, contractAddress: contractAddress, subnetwork: "32")
向智能合约写入
在我们向合约写入之前,我们需要定义
1- 函数名称
2- 函数参数
3- 随机数
4- NRG(能量)
5- NRG价格(能量价格)
6- 价值
参数满足后,现在我们可以调用 executeFunction
` let wallet = "0x0" let funcParams = Any functParams.append(BigInt.init(1)) // 对于这个智能合约,我们将发送1 let nrg = BigInt.init(50000) let nrgPrice = BigInt.init(10000000000) let nonce = BigInt.init(0) let value = BigInt.init(0)
尝试执行以下函数:aionContract.executeFunction(functionName: "addToState", wallet: wallet, functionParams: funcParams, nonce: nonce, nrg: nrg, nrgPrice: nrgPrice, value: value, handler: { (result, error) in // 结果将包含交易哈希 // 如果有错误,则包含从 Pocket Node 发送的错误 }) `
调用 AionContract 函数
调用智能合约函数时有两个主要区别:调用它是否会改变智能合约的状态。这由 JSON 中的 constant
属性指示。
要读取智能合约,您需要使用以下参数调用 executeConstantFunction
调用,以下是一个示例
1- 函数名称
2- 函数参数
3- 地址(可选)
4- NRG(能量,可选)
5- NRG 价格(能量价格,可选)
6- 价值(可选)
try? contract.executeConstantFunction(functionName: "multiply", fromAdress: nil, functionParams: [any](), nrg: nil, nrgPrice: nil, value: nil, handler: { (result, error) in
// Result will be a hex string representing the number 20: 0x14
// Error, if any, will be the error returned by the Pocket Node
})
参考资料
请参阅 AION JSON RPC 文档 此处,获取有关您可以从应用程序中调用的可用 RPC 方法的更多信息。