查询 Arweave
在 Arweave 上,新数据以交易的形式发布。每笔交易都有一组标头和与之关联的一些存储的字节数据。数据可以是完整的文件、图像、JSON、纯文本或加密数据。Arweave 节点并不关心。它们只存储与交易相关的raw字节,并通过这样做赚取费用/奖励。
如果我们必须筛选网络中所有节点中的所有字节才能找到我们感兴趣的字节,这将是一项艰巨的任务。幸运的是,arweave 交易标头能够存储最多2048 字节的自定义标签。
标记交易
自定义标签是名称和值的对。例如“App-Name”:“Permamail”或“App-Version”:“0.1.0”。arweave 协议对自定义标签没有施加太多限制,但有一些建议的最佳实践可以帮助保持一致。
对于我们类Twitter 的 dApp,我们只对标有“App-Name”:“PublicSquare”的交易感兴趣。这些交易中的每一个都代表我们希望在时间线上显示的用户的帖子。那么我们该怎么做呢?
Arweave 提供了一种使用标签查询交易的简单方法。https://arweave.net网关暴露了一个用于提交 GraphQL 查询的接口。它还提供了一个用于尝试查询的平台。
GraphQL是一种灵活的查询语言,服务可以使用它来构建自定义数据的Schema以供客户端查询。GraphQL 还允许客户端指定他们希望在结果中看到可用数据结构的哪些元素。
运行 GraphQL 查询
要查询 arweave,我们需要通过支持 GraphQL 的网关访问它。让我们前往https://arweave.net/graphql上的 GraphQL Playground 。
复制并粘贴以下查询...
query {
transactions(tags: [{
name: "App-Name",
values: ["PublicSquare"]
}])
{
edges {
node {
id
tags {
name
value
}
}
}
}
}
如果您不熟悉 GraphQL,一开始可能会觉得有点不知所措,但一旦您了解了其结构,它就相当容易阅读和理解。
query {<schema类型>( <筛选条件> ){ <返回结果的数据结构> }}
在示例查询中,我们粘贴的schema类型是transactions,但我们也可以查询blocks。Arweaves GraphQL 模式的完整描述写在中。该指南将过滤条件称为“查询结构”,将交易和区块的完整数据定义称为“数据结构”。
当谈到返回结果的结构时,要注意的是,您可以指定您感兴趣的完整数据结构的子集。例如,这里列出了交易schema的完整数据结构。
https://gql-guide.vercel.app/#full-data
在我们的案例中,我们对符合我们的过滤条件的任何交易的id和完成列表的tag
如果点击在线运行graphql的中间的运行按钮
您会注意到,我们在最初的查询中取回的交易列表是我们指定的数据结构中的字段。
如果你是区块链新手,这是意料之外的,我们还没有构建任何东西,为什么会有这些结果?原来我们已经使用“PublicSquare”: “App-Name” 标签进行了筛选。
Arweave 团队创始人 Sam Williams 几年前在github code snippet中提出了这种交易格式。从那时起,生态系统中的建设者们就一直在其基础上进行构建和实验。
通过构建此应用程序,我们也参与了这一传统。
回到查询 Arweave。您会注意到,在 GraphQL 结果中没有可读的的消息内容,只有标签和有关消息的信息。
这是因为 GraphQL 端点关注的是检索的属性transactions和blocks,而不是关联数据。
要获取交易数据,我们必须访问另一个 HTTP 接口。
https://arweave.net/<交易id>
复制结果中的一个id,并然后修改上述链接附加id。它应该看起来像这样……
https://arweave.net/eaUAvulzZPrdh6_cHwUYV473OhvCumqT3K7eWI8tArk
在浏览器中导航到该 URL(HTTP GET)的结果将是检索帖子的内容。在此示例中,它是……
Woah that's pretty cool 😎
太好了,现在我们有了开始构建所需的工具。(有关 arweave HTTP 接口的完整列表,请访问。)
入门
为了学习 arweave,我们使用create-react-app创建了一个简单的 react 应用程序。为了本指南的目的,我们假设您熟悉 react 并能够检查各种组件以了解它们的组织方式。如果对React不熟悉可以先进行有关于React的学习
为了跟随本教程,请从 github克隆一份public-square-app的副本。
git clone https://github.com/DanMacDonald/public-square-app.git
输入npm install安装依赖,并输入npm start启动项目
将会打开一个不具备什么功能的UI网站
从 javascript 查询
我们首先需要的是查询函数,我们可以从应用程序的任何地方调用它来从 arweave 检索数据。打开文件src/lib/api.js
并按如下方式更新buildQuery
函数。稍后我们将使此buildQuery函数动态读取和过滤返回结果。
export const buildQuery = () => {
const queryObject = { query: `{
transactions(first: 100,
tags: [
{
name: "App-Name",
values: ["PublicSquare"]
},
{
name: "Content-Type",
values: ["text/plain"]
}
]
) {
edges {
node {
id
owner {
address
}
data {
size
}
block {
height
timestamp
}
tags {
name,
value
}
}
}
}
}`}
return queryObject;
}
如果您留心观察,就会发现我们已向该tags部分添加了新的过滤条件。现在,我们还会查询"Content-Type:"text/plain"在返回的结果中
为什么要添加这个额外的过滤条件?事实证明,我们并不是唯一使用这个 PublicSquare 协议的人。其他开发人员也这样做了,他们将其走向了不同的方向。开发人员扩展协议的最常见方法之一是将帖子格式转换为 JSON(而不是纯文本),并将更多结构化数据嵌入帖子交易数据中。当他们这样做时,他们会将标签更改"Content-type"为"text/javascript"。
为了简化我们的教程,我们只处理带有"Content-type" :"text/plain"的帖子。还有哪些其他内容类型?按照"Content-type"的惯例,标签遵循 MIME 类型标准。您可以在此处找到Common MIME Type的列表。
我们还向结果数据结构中添加了一些数据。我们很快就会看到这些数据的用途。
很好!现在我们有一个可以为我们初始化查询的 JavaScript 函数,但是我们如何将其发布到网关以获取结果呢?