在 Arweave 上,新数据以交易的形式发布。每笔交易都有一组 header 和一些与交易相关的存储数据字节。这段数据可以是完整的文件、图片、JSON、纯文本或者加密后的数据。Arweave 节点不关心数据的内容。他们只是存储与交易相关的原始字节,并通过这样做来赚取费用/奖励。
Web3 正在加速发展,Arweave 作为基础设施将被更多的开发者采用,创造一个全新的、更加丰富多彩的生态系统。 PermaDAO 正是为此而建立起来的共建者社区。所以参与的人都能在这里找到自己的角色来贡献 Arweave 生态,任何关于 Arweave 的提案与任务都可以发布于此,并得到整个社区的支持与回馈。 加入PermaDAO,建设 Web3! 翻译自愿者:Ethever @ Contributer of PermaDAO
审校自愿者:Kyle @ Contributer of PermaDAO
在 Arweave 上,新数据以交易的形式发布。每笔交易都有一组 header 和一些与交易相关的存储数据字节。这段数据可以是完整的文件、图片、JSON、纯文本或者加密后的数据。Arweave 节点不关心数据的内容。他们只是存储与交易相关的原始字节,并通过这样做来赚取费用/奖励。
如果我们不得不筛选 Arweave 网络中所有节点上的所有字节以找到我们需要的字节,那将是一个非常痛苦的任务。幸好 Arweave 交易 header 能够存储多达 2048 字节 的自定义标签。
自定义标签是键值对,例如"App-Name": "Permamail" 和"App-Version":"0.1.0"。Arweave协议本身没有对自定义标签作太多的限制,但有提出一些 best practices (最佳实践)来帮助保持一致性。
在仿 Twitter 的 dapp 中,我们只关心带有"App-Name":"PublicSquare"标签的交易。每一个这样的交易都表示一个我们想要在时间轴中显示的用户发布的帖子。所以我们要怎么做呢?
Arweave 提供了一种使用标签查询交易的简单方法。https://arweave.net/ 网关公开了一个用于执行 GraphQL
查询的接口,它还为尝试查询提供 playground
。
GraphQL 是一门灵活的查询语言,服务提供商能够用它为客户端的查询构造一种可自定义的数据模式。 GraphQL 还允许客户端指定它希望在查询结果中看到的可用数据结构的某些元素。
要查询 arweave,我们需要通过支持 GraphQL 的网关访问它。让我们前往 GraphQL Playground,网址为 https://arweave.net/graphql。
复制并粘贴下面的代码进行查询:
query {
transactions(tags: [{
name: "App-Name",
values: ["PublicSquare"]
}])
{
edges {
node {
id
tags {
name
value
}
}
}
}
}
如果你先前不熟悉 GraphQL ,一开始它可能会让你不知所措,但是一旦你了解了它的结构,你就会发现它是非常易于阅读和理解的。
query {<schema type>( <filter criteria> ){ <data structure of the results> }}
在查询示例中, 我们输入的 schema type (模式类型) 是 transaction
,而且我们也可以用来查询block
。Arweave GraphQL 模式的完整描述写在 Arweave GraphQL 指南中。这份指南将过滤条件称为查询结构(Query Structures),将交易和区块的完整数据定义称为数据结构(Data Structure)。
需要注意的是,当谈到结果的结构时,你可以在完整的数据结构中指定一个你感兴趣的子集。例如,这里 列出了一个交易的完整数据结构。
在我们的例子中,我们对符合过滤条件的任何交易的 id
和 tags
的完整列表感兴趣。
点击面板中的”Play“按钮运行查询: <!--StartFragment-->
<!--EndFragment--> 你会注意到,我们取回了在原始查询中指定的结果数据结构中的交易列表。
如果你刚进入区块链领域,这可能会让你意外,我们还没有构建任何东西,为什么会存在这些结果?事实证明,我们过滤的 "App-Name": "PublicSquare"
标签已经使用一段时间了。
早在几年前 Arweave 团队 的创始人 Sam Williams 就在 github 中的一份 code snippet (代码片段)中提出了交易格式”。从那时起,生态中的建设者就一直在它的基础上来进行开发测试。
构建此应用程序我们也沿袭这一传统。回到查询 Arweave ,你会注意到 GraphQL
结果中没有可读的帖子消息,只有标签和关于帖子的信息。
这是因为GraphQL
端点关心的是检索 transaction
和 block
的属性,而不是它们的关联数据。
为了获取交易的数据我们必须使用另一个 HTTP 端点 https://arweave.net/<transaction id>
。
在你的复制查询结果中复制其中一个 id
然后修改上面的链接,将id
粘贴进去,它看起来应该像这样:https://arweave.net/eaUAvulzZPrdh6_cHwUYV473OhvCumqT3K7eWI8tArk
。
在浏览器中导航到该 URL (HTTP GET) 的结果将是检索帖子的内容。在这个例子中是……
Woah that's pretty cool 😎
太好了,现在我们有了开始构建所需的工具。(有关 Arweave HTTP 端点完整列表请查看 HTTP API 文档。)
为了学习 Arweave 我们使用 create-react-app 创建一个简单的 React 应用。出于本指南的目的,我们假设你熟悉 React 并能够自主查看各组件以了解它们的组织方式。如果你需要复习 React JS,完成 React JS 教程 将使您了解完成本指南所需的任何先决条件信息。
要按照本教程进行操作,请从 github 克隆 public-square-app 模板的副本。
git clone https://github.com/DanMacDonald/public-square-app.git
这将创建一个 /public-square-app 目录,我们可以导航到那:
cd public-square-app
注意,如果你想直接跳到 finish line(终点线),可以在 github 仓库的 finished branch 查看此示例项目的完整源代码。
接下来我们可以运行两条命令,第一条初始化我们的项目依赖项,第二个以开发人员模式启动它。
npm install
npm start
最后一条命令应该打开一个浏览器选项卡,其中包含我们 dApp 的 UI 结构,但没有数据。 <!--StartFragment-->
<!--EndFragment-->
您可以在用户界面中导航,但它非常空且处于非活动状态。在下一节中,我们将弄清楚如何解决这个问题。
我们首先需要的是一个查询函数,我们可以在应用的任何地方调用它来从 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;
}
如果你细心的话,你会发现我们在标签部分添加了一个新的过滤条件。现在我们还在查询返回的交易中寻找含有值为 "text/plain"
的 "Content-Type"
标签的交易。
为什么添加这个额外的过滤条件呢?好吧,事实上我们不是唯一一个使用 Public Sqaure
协议的人。其他开发人员也有,他们已经朝着不同的方向发展。开发人员扩展协议的最常见方式之一是将帖子格式转换为 JSON(而不是纯文本)并将更多结构化数据嵌入到帖子交易数据中。这时,他们将 "Content-type"
标签更改为 "text/javascript"
。
为了简化我们的教程,我们只处理 "Content-Type"
为 "text/plain"
的帖子。那还有其它的内容类型吗? 按照惯例,"Content-Type"
标签遵循 MIME 类型标准。你可以在 这里 查看常见 MIME 类型。
我们还在结果数据结构中添加了更多的数据,很快就能看到这样做的目的。
好的!现在我们已经有可以为我们初始化一个查询的 javascript 函数,但是我们如何将它发布到网关以获取结果呢?
关于 PermaDAO:Website | Twitter | Telegram | Discord| Medium | Youtube
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!