技术分享:如何在Arweave上实现文件永存

021fc569b43171d6fa65c53e89a87336.gif

1

概述

Arweave 作为一条为数据存储而生的区块链,可以让任何个人或团队以极低的成本进行数据的永久存储。但是直接和 Arweave 进行交互必须持有 AR Token ,这在某种程度提高了 Arweave 的使用门槛。

为了方便开发者快速入门,我们部署了 web3infura.io (http://web3infura.io/) 方便开发者永存数据。web3infura.io 支持多种 Token 进行存储费用的支付。(包括但不限于 ETH,USDT,CFX)

本教程将介绍如何使用 nodejs 以及 golang 将数据通过 web3infura.io 永久存储到 Arweave 网络。

2

准备工作

在进行数据上传之前,需要做一些必要的准备工作。

以下的步骤将介绍如何获取Token,为后面的文件存储费用支付做准备。

  1. MetaMask 钱包
    你需要拥有一个 MetaMask 钱包,里面需要有一点资产(只需少量就行,因为存储所需的费用非常少,后面会有说明)

  2. 在 everPay 进行充值
    你需要将 MetaMask 中的资产(ETH,USDT,USDC 等)跨链至 everPay。

    • 进入 everPay (https://app.everpay.io/) 主页,连接你的 MetaMask 钱包

    • 点击跨链,将 MetaMask 钱包中的资产充值到 everPay

    • 点击兑换,将充值的资产兑换为你想要的Token

3

数据上传

3.1 nodejs 版

准备好 node.js 开发环境

3.1.1 安装

请打开你的终端,使用以下指令安装 arseeding-js

npm i arseeding-js

3.1.2 上传文件

安装完成后,在目录下创建 demo.js,将以下代码复制到 demo.js:

import { genNodeAPI } from 'arseeding-js'
const instance = await genNodeAPI('YOUR PRIVATE KEY')


const arseedUrl = 'https://arseed.web3infura.io'
const data = Buffer.from('./cat.png')
const payCurrency = 'CFX'
const ops = {
    tags: [{name: "Content-Type",value:'img/png'}]
}
const res = await instance.sendAndPay(arseedUrl, data, payCurrency, ops)
console.log('res',res)

配置说明:

  • 将前文提到的 MetaMask 钱包对应的密钥填充到 YOUR PRIVATE KEY。

  • arseedUrl 是需要配置的 Arseeding 后端服务地址,这里我们使用的是 web3infura 服务,URL 为:https://arseed.web3infura.io

  • data 里需要填充你想要上传的二进制数据,开发者可以采用 file io 从硬盘上读取对应的文件。

  • payCurrency 是需要选择的支付代币,这里是 CFX,当然你也可以兑换其他代币,比如兑换成 ETH,那么就填写 ETH。

  • ops 里可以配置你的 Arweave Tags,什么是 Arweave Tags 参考:https://docs.web3infura.io/zh-cn/docs/other/tags

在准备好配置后,调用

await instance.sendAndPay(arseedUrl, data, payCurrency, ops)

 就可以将你的数据上传到 web3infura 的 Arseeding 节点。

在终端执行以下命令进行文件上传:

node demo.js

正确执行后终端将返回:

res {
  status: 'ok',
  everpayTx: {
    tokenSymbol: 'CFX',
    action: 'transfer',
    from: '0xDc19464589c1cfdD10AEdcC1d09336622b282652',
    to: 'uDA8ZblC-lyEFfsYXKewpwaX-kkNDDw8az3IW9bDL68',
    amount: '685213132323',
    fee: '0',
    feeRecipient: '0x6451eB7f668de69Fb4C943Db72bCF2A73DeeC6B1',
    nonce: '1658805735973',
    tokenID: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
    chainType: 'Conflux',
    chainID: '1030',
    data: '{"itemId":"iyosxBPXwPYXKYac31nEq3c5uDm4Wxsv0o-Yy8yaHvU","bundler":"uDA8ZblC-lyEFfsYXKewpwaX-kkNDDw8az3IW9bDL68","currency":"CFX","decimals":18,"fee":"685213132323","paymentExpiredTime":1658809335,"expectedBlock":982245}',
    version: 'v1',
    sig: '0x12e9342863734b0c3d0bf09cf191a38e0266692a3a0114723904f5e3d5205310706d1d6eaff86bda2f19d8ee46becc4c9512b419ecae36be844bd43da52a6fa41b'
  },
  everHash: '0x2cd991fb67206ccc93976a20a892833fecce9ae5261d4570d6b6bb3eac3783e7',
  order: {
    itemId: 'iyosxBPXwPYXKYac31nEq3c5uDm4Wxsv0o-Yy8yaHvU',
    bundler: 'uDA8ZblC-lyEFfsYXKewpwaX-kkNDDw8az3IW9bDL68',
    currency: 'CFX',
    decimals: 18,
    fee: '685213132323',
    paymentExpiredTime: 1658809335,
    expectedBlock: 982245
  }
}

最终这些数据将打包到 Arweave 网络,永存并不可篡改。

3.1.3 下载数据

在返回的结果中可以找到 res.order.itemId ,上文中 itemId 为 

iyosxBPXwPYXKYac31nEq3c5uDm4Wxsv0o-Yy8yaHvU

可以使用 curl 下载数据:

curl --location --request GET 'https://arseed.web3infura.io/iyosxBPXwPYXKYac31nEq3c5uDm4Wxsv0o-Yy8yaHvU'

3.2 Golang 版

准备好 golang 开发环境,新建一个 demo project。

3.2.1 安装

在 demo project 下打开你的终端,使用以下指令安装 arseeding sdk, goether

go mod tidy
go get github.com/everFinance/arseeding
go get github.com/everFinance/goether

3.2.2 上传文件

在 demo 项目下创建 一个 main.go 文件, 将以下代码复制进去:

package main


import (
  "fmt"
  "github.com/everFinance/arseeding/sdk"
  "github.com/everFinance/arseeding/sdk/schema"
  "github.com/everFinance/goar/types"
  "github.com/everFinance/goether"
  "io/ioutil"
)


func main() {
  privKey := "YOUR PRIVATE KEY"
  signer, err := goether.NewSigner(privKey)
  if err != nil {
    panic(err)
  }
  arseedUrl := "https://arseed.web3infura.io"
  payUrl := "https://api.everpay.io"
  uploader, err := sdk.NewSDK(arseedUrl, payUrl, signer)
  if err != nil {
    panic(err)
  }
  data, err := ioutil.ReadFile("sup.jpg")
  if err != nil {
    panic(err)
  }
  fmt.Println(len(data))
  tags := []types.Tag{
    {Name: "Content-Type", Value: "img/jpg"},
  }
  ord, itemId, err := uploader.SendDataAndPay(data, "USDC", &schema.OptionItem{Tags: tags})
  fmt.Println(ord)
  fmt.Println(itemId)
}

配置说明:

  • 将前文提到的 MetaMask 钱包对应的密钥填充到 YOUR PRIVATE KEY。

  • arseedUrl 是需要配置的 Arseeding 后端服务地址,这里我们使用的是 web3infura 服务,URL 为:https://arseed.web3infura.io

  • data 里需要填充你想要上传的二进制数据,本例上传了一张图片。

  • payCurrency 是需要选择的支付代币,这里我们采用 USDC。

  • ops 里可以配置你的 Arweave Tags,什么是 Arweave Tags 参考:https://docs.web3infura.io/zh-cn/docs/other/tags

在终端执行以下命令进行文件上传:

go run main.go

正确执行后将返回:

{
  tokenSymbol:"USDC"
  action:"transfer"
  from:"0xc4f4FA5D20B23e651ce11fB824270b317F11d3ba"
  to:"uDA8ZblC-lyEFfsYXKewpwaX-kkNDDw8az3IW9bDL68"
  amount:"807"
  fee:"0"
  feeRecipient:"0x6451eB7f668de69Fb4C943Db72bCF2A73DeeC6B1"
  nonce:"1660037820075"
  tokenID:"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
  chainType:"ethereum"
  chainID:"1"
  data:{
      "itemId":"1MG5tOIbSCijvaj9vr9qBudOGQ2-GLUYCL_xLjkRBc8",
      "bundler":"uDA8ZblC-lyEFfsYXKewpwaX-kkNDDw8az3IW9bDL68",
      "currency":"USDC",
      "decimals":6,
      "fee":"807",
      "paymentExpiredTime":1660041420,
      "expectedBlock":991931
   }

最终这些数据将打包到 Arweave 网络,永存并不可篡改。

3.2.3 下载数据

在返回的结果中可以找到 data.itemId ,上文中 itemId 为 1MG5tOIbSCijvaj9vr9qBudOGQ2-GLUYCL_xLjkRBc8

可以使用 curl 下载数据:

curl --location --request GET 'https://arseed.web3infura.io/1MG5tOIbSCijvaj9vr9qBudOGQ2-GLUYCL_xLjkRBc8'

也可以在浏览器直接输入

https://arseed.web3infura.io/1MG5tOIbSCijvaj9vr9qBudOGQ2-GLUYCL_xLjkRBc8

或者

https://arweave.net/1MG5tOIbSCijvaj9vr9qBudOGQ2-GLUYCL_xLjkRBc8

就可以获取并下载这张图片了。

4

储存成本

通过以上的教程,相信大家对于如何通过 web3infura 上传文件至 Arweave 进行永存已经有了一定的了解,那么如此方便的存储,费用情况是如何的呢?

获取储存费用

在前面的上传数据的例子中,返回的结果中的 data.fee 就是该笔上传数据所支付的费用,在 golang 用例中,我们使用 USDC 进行支付,fee 为 807,而 USDC 的 decimal 为 6,因此我们支付的费用仅为 0.000807 USDC!你没有看错,如此低的花费就可以将一张图片永存!

使用 API 接口获取存储费用

当然,你可能需要提前知道上传 xxx size 的数据需要的花费,web3infura 当然也提供了 API 接口来查询相应的存储费用。

Get Bundle Fee

查看上传数据的交易手续费。

Request:

Method: GET
URL: /bundle/fee/:size/:currency


params:


size: 需要上传的数据大小,以字节为单位.


currency: 用于支付 fee 的 token symbol, 支持 everpay 跨链的所有 token.

Response:

{
"currency": "USDC",
"decimals": 6,
"finalFee": "4413"
}

例如,你需要查询上传一个 1M 的文件并且用 USDC支付需要的费用:

可以在终端输入:

curl --location --request GET 'https://arseed.web3infura.io/bundle/fee/1048576/USDC'

或者直接在浏览器上输入:

https://arseed.web3infura.io/bundle/fee/1048576/USDC

就可以方便的查询了。

71ce6fc58596927551bbf85887571364.gif

风险提示:该文章仅作为教程使用,不构成任何投资观点。

f4579e5c5627e1d6687630f32179c34b.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值