国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【IPFS + 區(qū)塊鏈 系列】 入門篇 - IPFS + Ethereum (上篇)-js-ipfs

VincentFF / 611人閱讀

作者:黎躍春,孔壹學(xué)院創(chuàng)始人,區(qū)塊鏈、高可用架構(gòu)師

微信:liyc1215

區(qū)塊鏈博客:http://liyuechun.org

Ebay項目

基于以太坊Ethereum & IPFS的去中心化Ebay區(qū)塊鏈項目詳情鏈接

目錄

1. 內(nèi)容簡介

2. IPFS-HTTP效果圖

3. 實現(xiàn)步驟

3.1 安裝create-react-app

3.2 React項目創(chuàng)建

3.3 運行React項目

3.4 瀏覽項目

3.5 安裝ipfs-api

3.6 完成UI邏輯

3.7 導(dǎo)入IPFS

3.8 編寫上傳大文本字符串到IPFS的Promise函數(shù)

3.9 上傳數(shù)據(jù)到IPFS

3.10 跨域資源共享CORS配置

3.11 再次刷新網(wǎng)頁提交數(shù)據(jù)并在線查看數(shù)據(jù)

3.12 從IPFS讀取數(shù)據(jù)

3.13 總結(jié)

4. 下篇文章預(yù)告

1. 內(nèi)容簡介

【IPFS + 區(qū)塊鏈 系列】 入門篇 - IPFS環(huán)境配置

【IPFS + 區(qū)塊鏈 系列】 入門篇 - IPFS+IPNS+個人博客搭建

在前面兩篇文章中,第一篇春哥給大家詳細(xì)介紹了IPFS環(huán)境配置,第二篇介紹了IPFS如何搭建個人博客,通過這兩篇文章相信大家已經(jīng)對IPFS有所了解,接下來的這篇文章,我們將為大家講解js-ipfs-api的簡單使用,如何將數(shù)據(jù)上傳到IPFS,以及如何從IPFS通過HASH讀取數(shù)據(jù)。

2. IPFS-HTTP效果圖

3. 實現(xiàn)步驟 3.1 安裝create-react-app

參考文檔:https://reactjs.org/tutorial/tutorial.html

localhost:1123 yuechunli$ npm install -g create-react-app
3.2 React項目創(chuàng)建
localhost:1123 yuechunli$ create-react-app ipfs-http-demo
localhost:ipfs-http-demo yuechunli$ ls
README.md    package.json    src
node_modules    public        yarn.lock
localhost:ipfs-http-demo yuechunli$ 
3.3 運行React項目
localhost:ipfs-http-demo yuechunli$ npm start
Compiled successfully!

You can now view ipfs-http-demo in the browser.

  Local:            http://localhost:3000/
  On Your Network:  http://192.168.0.107:3000/

Note that the development build is not optimized.
To create a production build, use yarn build.
3.4 瀏覽項目

瀏覽器瀏覽http://localhost:3000

效果如下:

3.5 安裝ipfs-api

??:在這里我就不過多的去介紹React的使用以及開發(fā),如果感興趣的可以去看這套React的視頻,學(xué)完這套視頻你可以直接進企業(yè)找React相關(guān)的前端開發(fā)工作。

項目結(jié)構(gòu)

安裝ipfs-api

切換到項目根目錄,安裝ipfs-api。

$ npm uninstall --save ipfs-api
localhost:ipfs-http-demo yuechunli$ ls
README.md    package.json    src
node_modules    public        yarn.lock
localhost:ipfs-http-demo yuechunli$ pwd
/Users/liyuechun/Desktop/1123/ipfs-http-demo
localhost:ipfs-http-demo yuechunli$ npm uninstall --save ipfs-api

??:ipfs安裝完后,如上圖所示,接下來刷新一下瀏覽器,看看項目是否有問題,正常來講,一切會正常,???,Continue,Continue,Continue......

3.6 完成UI邏輯

拷貝下面的代碼,將src/App.js里面的代碼直接替換掉。

import React, { Component } from "react";
import "./App.css";

class App extends Component {


      constructor(props) {
          super(props);
          this.state = {
            strHash: null,
            strContent: null
          }
      }

    render() {
      return (
        

{this.state.strHash}

{this.state.strContent}

); } } export default App;

上面的代碼完成的工作是,當(dāng)我們在輸入框中輸入一個字符串時,點擊提交到IPFS按鈕,將文本框中的內(nèi)容取出來打印,后續(xù)我們需要將這個數(shù)據(jù)上傳到IPFS。點擊讀取數(shù)據(jù)按鈕,我們也只是隨便打印了一個字符串,后面需要從IPFS讀取數(shù)據(jù),然后將讀取的數(shù)據(jù)存儲到狀態(tài)機變量strContent中并且展示出來。

3.7 導(dǎo)入IPFS
const ipfsAPI = require("ipfs-api");
const ipfs = ipfsAPI({host: "localhost", port: "5001", protocol: "http"});
3.8 編寫上傳大文本字符串到IPFS的Promise函數(shù)
saveTextBlobOnIpfs = (blob) => {
    return new Promise(function(resolve, reject) {
      const descBuffer = Buffer.from(blob, "utf-8");
      ipfs.add(descBuffer).then((response) => {
        console.log(response)
        resolve(response[0].hash);
      }).catch((err) => {
        console.error(err)
        reject(err);
      })
    })
  }

response[0].hash返回的是數(shù)據(jù)上傳到IPFS后返回的HASH字符串。

3.9 上傳數(shù)據(jù)到IPFS
this.saveTextBlobOnIpfs(ipfsContent).then((hash) => {
    console.log(hash);
    this.setState({strHash: hash});
});

ipfsContent是從文本框中取到的數(shù)據(jù),調(diào)用this.saveTextBlobOnIpfs方法將數(shù)據(jù)上傳后,會返回字符串hash,并且將hash存儲到狀態(tài)機變量strHash中。

目前完整的代碼:

import React, {Component} from "react";
import "./App.css";

const ipfsAPI = require("ipfs-api");
const ipfs = ipfsAPI({host: "localhost", port: "5001", protocol: "http"});

class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      strHash: null,
      strContent: null
    }
  }

  saveTextBlobOnIpfs = (blob) => {
    return new Promise(function(resolve, reject) {
      const descBuffer = Buffer.from(blob, "utf-8");
      ipfs.add(descBuffer).then((response) => {
        console.log(response)
        resolve(response[0].hash);
      }).catch((err) => {
        console.error(err)
        reject(err);
      })
    })
  }

  render() {
    return (

{this.state.strHash}

{this.state.strContent}

); } } export default App;

測試:

3.10 跨域資源共享CORS配置

跨域資源共享( CORS )配置,依次在終端執(zhí)行下面的代碼:

localhost:ipfs-http-demo yuechunli$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods "["PUT", "GET", "POST", "OPTIONS"]"

localhost:ipfs-http-demo yuechunli$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin "["*"]"

localhost:ipfs-http-demo yuechunli$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Credentials "["true"]"

localhost:ipfs-http-demo yuechunli$ ipfs config --json API.HTTPHeaders.Access-Control-Allow-Headers "["Authorization"]"

localhost:ipfs-http-demo yuechunli$ ipfs config --json API.HTTPHeaders.Access-Control-Expose-Headers "["Location"]"

用正確的端口運行daemon:

localhost:ipfs-http-demo yuechunli$ ipfs config Addresses.API
/ip4/127.0.0.1/tcp/5001
localhost:ipfs-http-demo yuechunli$ ipfs config Addresses.API /ip4/127.0.0.1/tcp/5001
localhost:ipfs-http-demo yuechunli$ ipfs daemon
3.11 再次刷新網(wǎng)頁提交數(shù)據(jù)并在線查看數(shù)據(jù)

上傳數(shù)據(jù),并且查看返回hash值

在線查看上傳到IPFS的數(shù)據(jù)

3.12 從IPFS讀取數(shù)據(jù)

ipfs.cat

ipfs.cat(this.state.strHash).then((stream) => {
    console.log(stream);
    let strContent = Utf8ArrayToStr(stream);
    console.log(strContent);
    this.setState({strContent: strContent});
});

streamUint8Array類型的數(shù)據(jù),下面的方法是將Uint8Array轉(zhuǎn)換為string字符串。

Utf8ArrayToStr

function Utf8ArrayToStr(array) {
    var out, i, len, c;
    var char2, char3;

    out = "";
    len = array.length;
    i = 0;
    while(i < len) {
    c = array[i++];
    switch(c >> 4)
      {
        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
          // 0xxxxxxx
          out += String.fromCharCode(c);
          break;
        case 12: case 13:
          // 110x xxxx   10xx xxxx
          char2 = array[i++];
          out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
          break;
        case 14:
          // 1110 xxxx  10xx xxxx  10xx xxxx
          char2 = array[i++];
          char3 = array[i++];
          out += String.fromCharCode(((c & 0x0F) << 12) |
                         ((char2 & 0x3F) << 6) |
                         ((char3 & 0x3F) << 0));
          break;
        default:
          break;
      }
    }

    return out;
}

完整源碼

import React, {Component} from "react";
import "./App.css";

const ipfsAPI = require("ipfs-api");
const ipfs = ipfsAPI({host: "localhost", port: "5001", protocol: "http"});

function Utf8ArrayToStr(array) {
  var out,
    i,
    len,
    c;
  var char2,
    char3;

  out = "";
  len = array.length;
  i = 0;
  while (i < len) {
    c = array[i++];
    switch (c >> 4) {
      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 5:
      case 6:
      case 7:
        // 0xxxxxxx
        out += String.fromCharCode(c);
        break;
      case 12:
      case 13:
        // 110x xxxx   10xx xxxx
        char2 = array[i++];
        out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
        break;
      case 14:
        // 1110 xxxx  10xx xxxx  10xx xxxx
        char2 = array[i++];
        char3 = array[i++];
        out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
        break;
      default:
        break;
    }
  }

  return out;
}

class App extends Component {

  constructor(props) {
    super(props);
    this.state = {
      strHash: null,
      strContent: null
    }
  }

  saveTextBlobOnIpfs = (blob) => {
    return new Promise(function(resolve, reject) {
      const descBuffer = Buffer.from(blob, "utf-8");
      ipfs.add(descBuffer).then((response) => {
        console.log(response)
        resolve(response[0].hash);
      }).catch((err) => {
        console.error(err)
        reject(err);
      })
    })
  }

  render() {
    return (

{this.state.strHash}

{this.state.strContent}

); } } export default App;
3.13 總結(jié)

這篇文章主要講解如何配置React環(huán)境,如何創(chuàng)建React項目,如何安裝js-ipfs-api,如何上傳數(shù)據(jù),如何設(shè)置開發(fā)環(huán)境,如何下載數(shù)據(jù)等等內(nèi)容。通過這篇文章的系統(tǒng)學(xué)習(xí),你會掌握js-ipfs-api在項目中的使用流程。

這是【IPFS + 區(qū)塊鏈 系列】 入門篇 - IPFS + Ethereum (上篇)-js-ipfs-api,下篇講解如何將IPFS和以太坊智能合約結(jié)合進行數(shù)據(jù)存儲。

4. 下篇文章預(yù)告

這是【IPFS + 區(qū)塊鏈 系列】 入門篇 - IPFS + Ethereum (上篇)-js-ipfs-api,下篇講解如何將IPFS和以太坊智能合約結(jié)合進行數(shù)據(jù)存儲。

5. 技術(shù)交流

區(qū)塊鏈技術(shù)交流QQ群:348924182

進微信群請加微信:liyc1215

「區(qū)塊鏈部落」官方公眾號

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/23933.html

相關(guān)文章

  • 區(qū)塊技術(shù)學(xué)習(xí)指引

    摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實應(yīng)用場景,想做區(qū)塊鏈應(yīng)用開發(fā),可進一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請讀者前往原文閱讀 本章的文章越來越多,本文是一個索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...

    Cristic 評論0 收藏0
  • 【戴嘉樂】(進階)基于IPFS和Ngrok構(gòu)建自維護資源網(wǎng)關(guān)

    摘要:五參考文獻區(qū)塊鏈利用構(gòu)建自己的去中心化分布式系統(tǒng)相關(guān)文章和視頻推薦戴嘉樂入門基于和構(gòu)建自維護資源網(wǎng)關(guān)圓方圓學(xué)院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。 作者簡介:戴嘉樂( Mr.Maple ) | 前百度高級研發(fā)工程師 | IPFS應(yīng)用實踐者&布道師|個人網(wǎng)站:https://www.daijiale.cn聯(lián)系方式:微信號:daijiale6239。 一、背景 上篇文章[《(入門...

    xiyang 評論0 收藏0
  • 【戴嘉樂】(入門)基于IPFS和Ngrok構(gòu)建自維護資源網(wǎng)關(guān)

    摘要:作者簡介戴嘉樂前百度高級研發(fā)工程師應(yīng)用實踐者布道師個人網(wǎng)站聯(lián)系方式微信號。二技術(shù)介紹對這項技術(shù)不熟悉的同學(xué),可以參考我之前一次演講分享的內(nèi)容戴嘉樂詳解的本質(zhì)技術(shù)架構(gòu)以及應(yīng)用。 作者簡介:戴嘉樂( Mr.Maple ) | 前百度高級研發(fā)工程師 | IPFS應(yīng)用實踐者&布道師|個人網(wǎng)站:https://www.daijiale.cn聯(lián)系方式:微信號:daijiale6239。 一、應(yīng)用背...

    CloudwiseAPM 評論0 收藏0
  • 2018以太坊智能合約編程語言solidity的最佳IDEs

    摘要:使用基于以太坊的智能合約的集成開發(fā)環(huán)境。以太坊教程,主要介紹智能合約與應(yīng)用開發(fā),適合入門。以太坊,主要是介紹使用進行智能合約開發(fā)交互,進行賬號創(chuàng)建交易轉(zhuǎn)賬代幣開發(fā)以及過濾器和事件等內(nèi)容。 Solidity是一種以智能合約為導(dǎo)向的編程語言。這是一種只有四年的年輕語言,旨在幫助開發(fā)基于以太坊數(shù)字貨幣的智能合約。 理解它官方文檔應(yīng)該是學(xué)習(xí)Solidity的最佳來源:solidity.read...

    darkerXi 評論0 收藏0
  • 【戴嘉樂】基于IPFS和GeoHash構(gòu)建具有地理位置價值服務(wù)的DDApp(理論

    摘要:數(shù)據(jù)將具有如下個特點將二維的經(jīng)緯度轉(zhuǎn)換成字符串,比如下圖展示了北京個區(qū)域的字符串,分別是,等等,每一個字符串代表了某一矩形區(qū)域。例如,坐標(biāo)對,位于北京安定門附近,后形成的值為。 作者簡介:戴嘉樂( Mr.Maple ) | 前百度高級研發(fā)工程師 | IPFS應(yīng)用實踐者&布道師|個人網(wǎng)站:https://www.daijiale.cn聯(lián)系方式:微信號:daijiale6239。 show...

    lmxdawn 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<