Arweave Swift SDK 客户端

GitHub license SPM compatible Twitter

Arweave 区块链的轻量级 Swift 客户端,为与 Arweave API 交互提供类型安全

⚠️ master 分支需要 Xcode 13 / Swift 5.5。如需支持旧版本,请参阅 stable 分支

安装

要通过 Swift Package Manager 安装,请将 Arweave 添加到您的 Package.swift 文件中。或者,直接将其添加到您的 Xcode 项目

let package = Package(
    ...
    dependencies: [
        .package(url: "https://github.com/lukereichold/arweave-swift.git", from: "1.1.0")
    ],
    ...
)

然后,在您想使用它的任何地方导入 Arweave

import Arweave

演示

请参阅包含的演示应用程序,该应用程序使用 SwiftUI 编写,它从现有的 Arweave JWK 密钥文件动态创建 Wallet 对象,并使用 iOS 共享扩展 来创建和提交一个新的数据交易,其中包含 Safari 中给定页面的数据。

用法

指定自定义 Arweave 节点(可选)

Arweave.baseUrl = URL(string: "https://myArweaveNode.net:443")!

创建一个自定义 URL 来指定目标节点的主机、端口和协议。所有后续请求将自动发送到此自定义主机。

钱包和密钥

从现有的 JWK 密钥文件创建钱包

guard let keyFileData = try? Data(contentsOf: keyFileUrl) else { return }

let wallet = Wallet(jwkFileData: keyFileData)

获取钱包的公钥地址

wallet.address
/// 1seRanklLU_1VTGkEk7P0xAwMJfA7owA1JHW5KyZKlY

检查钱包余额 (异步)

所有钱包余额均使用 winston 单位返回。

let balance = try await wallet.balance()

在 AR 和 winston 单位之间转换金额

var transferAmount = Amount(value: 1, unit: .AR)
let amtInWinston = transferAmount.converted(to: .winston)
XCTAssertEqual(amtInWinston.value, 1000000000000, accuracy: 0e-12) // ✅

transferAmount = Amount(value: 2, unit: .winston)
let amtInAR = transferAmount.converted(to: .AR)
XCTAssertEqual(amtInAR.value, 0.000000000002, accuracy: 0e-12) // ✅

获取给定钱包的最后交易 ID (异步)

let lastTxId = try await wallet.lastTransactionId()

交易

交易是 Arweave 永久网络 (permaweb) 的构建块。它们可以在钱包地址之间发送 AR 或在 Arweave 网络上存储数据。

创建数据交易

数据交易用于在 Arweave 永久网络上存储数据,并且可以包含任何任意数据。

let data = "<h1>Hello World!</h1>".data(using: .utf8)!
let transaction = Transaction(data: data)

创建钱包到钱包的交易

let targetAddress = Address(address: "someOtherWalletAddress")
let transferAmount = Amount(value: 500, unit: .winston)

let transaction = Transaction(amount: transferAmount, target: targetAddress)

修改现有交易

元数据可以选择性地添加到交易中,通过标签实现,这些标签是简单的键/值属性,可用于记录交易的内容或提供相关数据。

let tag = Transaction.Tag(name: "myTag", value: "myValue")
transaction.tags.append(tag)

签名和提交交易

上述数据和钱包到钱包的交易初始化器仅创建未签名的 Transaction 对象。但是,要提交到网络,每个 Transaction 必须先签名。

let transaction = Transaction(data: data)
let signedTx = try await transaction.sign(with: wallet)
try await signed.commit()

⚠️ 在签名后修改交易对象将使签名无效,如果在此状态下提交,将导致其被网络拒绝。交易价格基于数据字段的大小,因此不建议在创建交易后修改数据字段,因为您需要手动更新价格。

交易 ID 是交易签名的哈希值,因此在交易内容最终确定并签名之前,无法知道交易 ID。

获取交易状态 (异步)

let txStatus = try await Transaction.status(of: exampleTxId)

/// Arweave.Transaction.Status.accepted(data: Arweave.Transaction.Status.Data(block_height: 502761, block_indep_hash: "V6pCKSyeQiqICWKM2G_zkQ8SCA_WKnZoVGOD8eKFV_xozoWS9xPFgncxnMWjtFao", number_of_confirmations: 8655))

获取给定 ID 的交易内容 (异步)

let tx = try await Transaction.find(exampleTxId)

获取交易数据 (异步)

我们可以获取给定交易 ID 的交易数据(表示为 base64 URL 编码的字符串),而无需获取整个 Transaction 对象。

let txData = try await Transaction.data(for: exampleTxId)

贡献

欢迎贡献。请查看 问题列表