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.baseUrl = URL(string: "https://myArweaveNode.net:443")!
创建一个自定义 URL
来指定目标节点的主机、端口和协议。所有后续请求将自动发送到此自定义主机。
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()
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) // ✅
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))
let tx = try await Transaction.find(exampleTxId)
我们可以获取给定交易 ID 的交易数据(表示为 base64 URL 编码的字符串),而无需获取整个 Transaction 对象。
let txData = try await Transaction.data(for: exampleTxId)
欢迎贡献。请查看 问题列表。