Хранение данных децентрализованным способом невероятно важно при создании децентрализованного приложения, а arweave упрощает постоянное хранение данных в децентрализованной сети.

Вот как загрузить файл изображения и отобразить его из arweave в Javascript.

Я буду использовать Reactjs, Nodejs и функции Firebase, но вы можете использовать практически любой фреймворк или бэкэнд.

Шаг 1) Настройте наш интерфейс

import React from 'react'
const AddImage = () => {
    const hiddenFileInput = React.useRef(null)
    const [file, setFile] = React.useState(null)
    const handleChange = event => {
        const fileUploaded = event.target.files[0]
        setFile(fileUploaded)
    }
     return (
        <div>
            <button type="button" onClick={handleClick}>
            Upload a file
            </button>
            <input
            type="file"
            name="tokenImage"
            ref={hiddenFileInput}
            onChange={handleChange}
            style={{ display: 'none' }}
            />
        </div>
    )
}
export default AddImage

Этот компонент обрабатывает ввод изображения и сохраняет его в переменной состояния. Примечание. Я удалил все стили для простоты.

Шаг 2) Загрузите файл в хранилище Firebase

import { getStorage, ref, getDownloadURL, uploadBytes } from 'firebase/storage'
const filePath = await uploadFile(file)
const uploadFile = async file => {
  const storage = getStorage()
  const randomId = makeid(21)
  const filePath = 'files/' + randomId + file.name
  const storageRef = ref(storage, filePath)
  await uploadBytes(storageRef, file).then(snapshot => {
    console.log('Uploaded file!: ', filePath)
  })
 return getDownloadURL(storageRef).then(url => {
    return filePath
  })
}

Шаг 3) Настройка функции Arweave

Наша функция firebase будет обертывать пакет arweave JS.

Вы можете получить свой закрытый ключ arweave, создав новый кошелек Arweave:

const arweaveKey = "XXX...XX"
// Arweave Testnet
// const arweave = Arweave.init({
//   host: '127.0.0.1',
//   port: 1984,
//   protocol: 'http',
// })
// Arweave Mainnet
const arweave = Arweave.init({
  host: 'arweave.net',
  port: 443,
  protocol: 'https',
})
export const uploadToArweave = functions.https.onCall(async (data) => {
  const { filePath } = data
  // upload to arweave and get id
  async function createTransaction(arrayBuffer: ArrayBuffer) {
    if (!arrayBuffer) return
   try {
      /* creates and sends transaction to Arweave */
      const transaction = await arweave.createTransaction(
        { data: arrayBuffer },
        arweaveKey,
      )
      await arweave.transactions.sign(transaction, arweaveKey)
      const uploader = await      
      arweave.transactions.getUploader(transaction)
     /* upload indicator */
      while (!uploader.isComplete) {
        await uploader.uploadChunk()
        console.log(
          `${uploader.pctComplete}% complete,   ${uploader.uploadedChunks}/${uploader.totalChunks}`,
        )
      }
      console.log('transaction: ', transaction)
      return transaction.id
    } catch (err) {
      console.log('createTransaction error: ', err)
    }
   }
  // download file from google bucket
  const [bufferFile] = await admin
    .storage()
    .bucket('bucket-name')
    .file(filePath)
    .download()
  const toArrayBuffer = (buf: Buffer) => {
    const ab = new ArrayBuffer(buf.length)
    const view = new Uint8Array(ab)
    for (let i = 0; i < buf.length; ++i) {
      view[i] = buf[i]
    }
    return ab
  }
  const arrayBuffer = await toArrayBuffer(bufferFile)
  const id = await createTransaction(arrayBuffer)
  return id
})

Наша функция принимает путь к файлу, указывающий на расположение нашего файла в Google Cloud Storage, а затем преобразует его в ArrayBuffer для отправки в Arweave.

Оттуда Arweave возвращает идентификатор транзакции, который мы можем использовать для получения нашего файла.

Шаг 4) Отображение изображения в нашем интерфейсе

Мы можем использовать JS-пакет arweave для получения необработанных данных из транзакции или просто отобразить файл с удаленного URL-адреса arweave. Я выбрал последнее, потому что это проще, но вот как скачать транзакцию arweave

// Get the base64url encoded string
arweave.transactions.getData('bNbA3TEQVL60xlgCcqdz4ZPHFZ711cZ3hmkpGttDt_U').then(data => {
  console.log(data);
  // CjwhRE9DVFlQRSBodG1sPgo...
});
// Get the data decoded to a Uint8Array for binary data
arweave.transactions.getData('bNbA3TEQVL60xlgCcqdz4ZPHFZ711cZ3hmkpGttDt_U', {decode: true}).then(data => {
  console.log(data);
  // Uint8Array [10, 60, 33, 68, ...]
});
// Get the data decode as string data
arweave.transactions.getData('bNbA3TEQVL60xlgCcqdz4ZPHFZ711cZ3hmkpGttDt_U', {decode: true, string: true}).then(data => {
  console.log(data);
  // <!DOCTYPE HTML>...
});

Чтобы отобразить данные транзакции, вы можете просто добавить идентификатор транзакции к URL-адресу arweave:

const image = https://arweave.net/<tx-id-goes-here>

Тогда все, что вам нужно сделать, это добавить компонент изображения

<img alt="arweave" style={{ width: '200px' }} src={image}/>

Шаг 5) Празднуйте! 🎉

Теперь вы можете хранить и отображать файлы в децентрализованной сети с помощью arweave.

Если вы хотите узнать больше, ознакомьтесь с другими моими проектами Ownchain и Mortar, которые используют arweave для хранения файлов.