Автор оригинала: FreeCodeCamp Community Member.
Нихарика Сингх
Почему инфура?
Есть много болевых точек, с которыми сталкиваются Blockchain, который может быть решен инфурой и/или межпланетной файловой системой (IPFS) в некоторой степени. Это основные задачи:
- Это дорого хранить данные о блокчане Ethereum
- Трудно настроить клиент Ethereum GETH
- Трудно масштабировать инфраструктуру
Если вы используете Infuro, доступ к сети Ethereum и IPFS становится намного быстрее. Он больше не занимает часы, чтобы синхронизировать клиента GETH, который использует огромный кусок памяти и пропускной способности, а весь блокчан загружается.
Вот несколько других преимуществ, которые приходят с использованием Infura:
- Огромное количество данных может быть сохранена на IPFS, а только хэш файла может быть сохранен на Ethereum.
- Infura обеспечивает безопасный, надежный, масштабируемый и простой в использовании API для доступа к сети Ethereum и IPFS. Разработчики не должны беспокоиться о инфраструктуре узла Ethereum или узла IPFS. Это заботится о инфузии.
- Infura предоставляет TLS с поддержкой общественных конечных точек.
- Код переносимо по интерфейсу Ethereum с использованием JSON RPC, Web3.
- Инфура практически является швейцарским армейским ножом разработчика, а также спасает команду развертывания из ада проблем масштабируемости.
- И, наконец, инфура доверяется:
DAPP Описание
Наш DAPP примет файл в качестве ввода от пользователя и загружает его на IPF, вызывая договор Ethereum. Хэш файла будет храниться на Ethereum.
Это процесс, который мы пройдем:
- Принять файл в качестве ввода
- Конвертировать файл в буфер
- Загрузить буфер для IPFS
- Хэш Хэш файла, возвращаемый IPFS
- Получить адрес метамаска пользователя Ethereum адрес
- Пользователь подтверждает транзакцию до Ethereum через метамаск
- HASH IPFS написан на Ethereum
Технический стек вовлечен
- Реагировать – Либлиотека передней конечной
- Солидность – язык, используемый для создания интеллектуальных контрактов, которые запускаются на Ethereum
- IPFS – децентрализованное хранение
- Инфура -Api доступ к сети Ethereum и IPFS
Давайте код!
Установите следующие зависимости:
$ npm i -g create-react-app$ npm install react-bootstrap$ npm install fs-extra$ npm install ipfs-api$ npm install web3
После того, как вы закончите, запустите следующую команду на вашем CLI, чтобы создать образец React Project. Я назову свой проект IPFS Отказ
$ create-react-app ipfs
Разверните умный контракт на ropsten testnet
. Сделайте, что вы на ropsten Testnet на метамаске.
Чтобы развернуть умный контракт, нам нужен эфир. Чтобы получить эфир для ropsten testnet, перейдите в https://faucet.metamask.io/ Отказ
Развернуть умный контракт, перейдите в https://remix.ethereum.org Отказ
pragma solidity ^0.4.17;
contract Contract { string ipfsHash; function setHash(string x) public { ipfsHash = x; } function getHash() public view returns (string x) { return ipfsHash; }
}
Сохранить адрес Smart Contract. Мой это: 0x610dd75057738b73e3f17a9d607db16a44f962f1
Также сохраните бинарный интерфейс приложения (ABI) в JSON. Его можно найти на вкладке «Compile», под «деталями».
Мой следующий:
[ { "constant": false, "inputs": [ { "name": "x", "type": "string" } ], "name": "sendHash", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "getHash", "outputs": [ { "name": "x", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }]
В каталоге «IPFS/SRC» создайте следующие файлы: web3.js , IPFS.JS и storehash.js Отказ
Файл 1 – web3.js
import Web3 from 'web3';
const web3 = new Web3(window.web3.currentProvider);
export default web3;
Файл 2 – Storehash.js
import web3 from './web3';
//Your contract addressconst address = '0x610dd75057738b73e3f17a9d607db16a44f962f1';
//Your contract ABIconst abi = [ { "constant": false, "inputs": [ { "name": "x", "type": "string" } ], "name": "sendHash", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "getHash", "outputs": [ { "name": "x", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }]
export default new web3.eth.Contract(abi, address);
Файл 3 – IPFS.JS
const IPFS = require('ipfs-api');const ipfs = new IPFS({ host: 'ipfs.infura.io', port: 5001, protocol: 'https' });
export default ipfs;
Редактировать – index.js.
import React from 'react';import ReactDOM from 'react-dom';import './index.css';import App from './App';import registerServiceWorker from './registerServiceWorker';import 'bootstrap/dist/css/bootstrap.min.css';
ReactDOM.render(, document.getElementById('root'));registerServiceWorker();
Файл 4 – App.js
import React, { Component } from 'react';import web3 from './web3';import ipfs from './ipfs';import storehash from './storehash';import { Button } from 'reactstrap';
class App extends Component {
state = { ipfsHash:null, buffer:'', ethAddress:'', transactionHash:'', txReceipt: '' };
//Take file input from usercaptureFile =(event) => { event.stopPropagation() event.preventDefault() const file = event.target.files[0] let reader = new window.FileReader() reader.readAsArrayBuffer(file) reader.onloadend = () => this.convertToBuffer(reader) };
//Convert the file to buffer to store on IPFS convertToBuffer = async(reader) => { //file is converted to a buffer for upload to IPFS const buffer = await Buffer.from(reader.result); //set this buffer-using es6 syntax this.setState({buffer}); };
//ES6 async functiononClick = async () => {try{ this.setState({blockNumber:"waiting.."}); this.setState({gasUsed:"waiting..."});
await web3.eth.getTransactionReceipt(this.state.transactionHash, (err, txReceipt)=>{ console.log(err,txReceipt); this.setState({txReceipt}); }); }catch(error){ console.log(error); }}
onSubmit = async (event) => { event.preventDefault();
//bring in user's metamask account address const accounts = await web3.eth.getAccounts(); //obtain contract address from storehash.js const ethAddress= await storehash.options.address; this.setState({ethAddress}); //save document to IPFS,return its hash#, and set hash# to state await ipfs.add(this.state.buffer, (err, ipfsHash) => { console.log(err,ipfsHash); //setState by setting ipfsHash to ipfsHash[0].hash this.setState({ ipfsHash:ipfsHash[0].hash }); // call Ethereum contract method "sendHash" and .send IPFS hash to etheruem contract //return the transaction hash from the ethereum contract storehash.methods.sendHash(this.state.ipfsHash).send({ from: accounts[0] }, (error, transactionHash) => { console.log(transactionHash); this.setState({transactionHash}); }); }) };
render() {
return (Ethereum and IPFS using Infura
Choose file to send to IPFS
Tx Receipt Category Values
IPFS Hash stored on Ethereum : {this.state.ipfsHash} Ethereum Contract Address : {this.state.ethAddress} Tx # : {this.state.transactionHash}
И это все!
Доступ к вашему DAPP в Localhost: 3000. Загрузите файл, и вы увидите генерацию хеша. Чтобы убедиться, что ваш файл загружен, доступа к нему через шлюз IPFS. Убедитесь, что вы принимаете запрашивания метамаска.
Доступ к файлу по адресу: https://gateway.ipfs.io/ipfs/your ipfs hash
Мой на: https://gateway.ipfs.io/ipfs/qmbyizshlirdfzhms75tdrrdivkaxkvbclpxzjb5k34a31.
Чтобы узнать больше о IPF, см. Мои другие статьи:
Узнайте, делая: хорошее и простое введение в межпланетарную файловую систему Грунтовка на IPFS Medium.freecodeCamp.org IPFS? И меркле лес? W H AT IPFS? HA cknoon.com.