Crear un formulario en IPFS para que los usuarios ingresen datos

Quería crear un sitio web y subirlo a IPFS para que los usuarios subieran datos (como su foto, nombre, etc.).

Pero, ¿cómo puedo capturar exactamente todos los detalles cargados por el usuario, obtener el IPFS Hash producido y luego colocar el hash en mi contrato de solidez para almacenar el hash en la cadena de bloques de ethereum?

Cualquier enlace o comentario será muy apreciado. Lo siento si la pregunta es un poco tonta.

Hola Rahul, ¿puede consultar datos JSON en función de algunos atributos de IPFS?

Respuestas (1)

En cuanto a la información del usuario, puede ser muy conveniente almacenarla en formato JSON. Tengo un ejemplo de cómo interactuar con el objeto JSON en ipfs, cómo obtener hash, almacenarlo y luego recuperarlo del contrato inteligente:

MiContrato.sol

pragma solidity ^0.4.18;

contract MyContract {

  string public ipfsHash;

  function setHash(string _ipfsHash) external {
    ipfsHash = _ipfsHash;
  }
}

prueba.js

const ipfs = require("nano-ipfs-store").at("https://ipfs.infura.io:5001");
const MyContract = artifacts.require("MyContract")

async function test() {
  const data = JSON.stringify({
    name: "JSON Statehem",
    link0: "stackexchange.com",
    link1: "github.com",
    link2: "myfacebook.com"
  })

  const ipfsHash = await ipfs.add(data)
  const instance = await MyContract.deployed()

  await instance.setHash.sendTransaction(ipfsHash)

  let returnedHash = await instance.ipfsHash.call()

  console.log(ipfsHash)
  console.log(returnedHash)

  console.log(JSON.parse(await ipfs.cat(returnedHash)))

}

test()

Puede almacenar el tipo de hash ipfs en Solidity bytes, pero prefiero almacenarlo stringporque no tendré que hacer ninguna conversión mientras recupero el valor de bytes.


¿Qué pasa con las imágenes? Deberá crear un búfer de la imagen y luego simplemente subirla a ipfs usando .add. Devolverá hash que puede almacenar como en el ejemplo anterior.

¡Wow gracias! Una cosa que no entendí del todo: entonces, ¿funciona si creo un sitio web/formulario de algún tipo que solicite detalles del usuario y luego hago lo que sugirió con esos detalles? ¿O crees que hay un camino más corto?
@RahulKothari Creo que la forma más optimizada es obtener toda la información del usuario al mismo tiempo. Solo porque pagará gas por una transacción de ethereum en lugar de almacenar el hash ipfs de cada campo de entrada. En realidad, esta es una forma bastante corta, ya que solo necesitará reemplazar las variables en el código anterior con $("#input").val().
¡Derecho! Solo otra pregunta de seguimiento: ¿cómo debo obtener exactamente la información del usuario? Me refiero a través de un contrato de solidez? o un sitio web? o cual metodo?
@RahulKothari obtiene información del usuario a través del formulario de interfaz de entrada estándar. Cuando recupere datos, simplemente llame ipfsHashdesde el contrato (llamada gratuita, porque no estamos cambiando el estado) y cuando obtenga hash recupere datos de ipfs con ipfs.cat(). Después de eso, simplemente acceda a los datos como un json normal y envíelos donde quiera en su sitio web.
¡Muchas gracias! Realmente aprecio que lo reduzcas a este nivel simple. Sin embargo, no estoy seguro de qué significa exactamente esto: const ipfs = require("nano-ipfs-store").at("https://ipfs.infura.io:5001");¿cómo vincula exactamente el archivo a ipfs?
@RahulKothari esta línea solo importa el módulo nano-ipfs y se conecta al host infura. Agregar archivo es fone con ipfs.add(data).
ethereum.stackexchange.com/questions/39659/… -> ¡el método que diste de alguna manera no parece funcionar! ¿Puedes mostrarme dónde me equivoqué?
Hola, @RomanFrolov, ¿puede consultar datos JSON en función de algunos atributos de IPFS?