以太坊+IPFS+WEB 電商平臺開發講解

以太坊+IPFS+WEB 電商平臺開發講解

作者: AlexTan

CSDN: http://blog.csdn.net/alextan_

Github: https://github.com/AlexTan-b-z

e-mail: [email protected]

一、介紹:

本教程主要講解接口實現以及相關概念,具體實現請期待後續教程

以太坊:以太坊(Ethereum)是一個建立在區塊鏈技術之上, 去中心化應用平臺。它允許任何人在平臺中建立和使用通過區塊鏈技術運行的去中心化應用。

對這句話不理解的同學,姑且可以理解爲以太坊是區塊鏈裏的Android,它是一個開發平臺,讓我們就可以像基於Android Framework一樣基於區塊鏈技術寫應用。

在沒有以太坊之前,寫區塊鏈應用是這樣的:拷貝一份比特幣代碼,然後去改底層代碼如加密算法,共識機制,網絡協議等等(很多山寨幣就是這樣,改改就出來一個新幣)。以太坊平臺對底層區塊鏈技術進行了封裝,讓區塊鏈應用開發者可以直接基於以太坊平臺進行開發,開發者只要專注於應用本身的開發,從而大大降低了難度。


目前圍繞以太坊已經形成了一個較爲完善的開發生態圈:有社區的支持,有很多開發框架、工具可以選擇。

智能合約:以太坊上的程序稱之爲智能合約, 它是代碼和數據(狀態)的集合。智能合約的默認的編程語言是Solidity,文件擴展名以.sol結尾。一個合約對象就相當於一個Class(類)。Solidity是和JavaScript相似的語言,用它來開發合約並編譯成以太坊虛擬機字節代碼。


智能合約可以理解爲在區塊鏈上可以自動執行的(由事件驅動的)、以代碼形式編寫的合同(特殊的交易)。

關於以太坊的更多介紹,推薦博客:以太坊是什麼

IPFS:星際文件系統IPFS(InterPlanetary File System)是一個面向全球的、點對點的分佈式版本文件系統,目標是爲了補充(甚至是取代)目前統治互聯網的超文本傳輸協議(HTTP),將所有具有相同文件系統的計算設備連接在一起。原理用基於內容的地址替代基於域名的地址,也就是用戶尋找的不是某個地址而是儲存在某個地方的內容,不需要驗證發送者的身份,而只需要驗證內容的哈希,通過這樣可以讓網頁的速度更快、更安全、更健壯、更持久。

二、使用:

項目架構:


說明:

以太坊: 本電商平臺主要用以太坊來實現用戶、支付功能,以及一些小商品數據的存儲。IPFS:本電商平臺主要用IPFS來存儲一些大文件。(目前IPFS是免費提供雲存儲的,ps:還可以用IPNS來免費搭建博客

後臺以及數據庫:用來存儲一些商品數據,減少以太坊智能合約gas費的消耗(可選,注:如果用上這一部分,那麼完全去中心化的平臺將變成一個半中心化的平臺,會失去一些區塊鏈本身的一些特性,比如說安全性將會降低等)


較傳統WEB項目而言,就以電商平臺來說,如果說做完全去中心化的平臺,那麼則可以完全省去後臺以及數據庫的開發。賬戶就用以太坊的賬戶,商品的簡單屬性可以通過合約存放在以太坊區塊鏈中(這樣會消耗更多的gas費),商品的具體描述、圖片等大文件可以存放在ipfs中,支付等過程也可以完全通過合約來實現,不過具體運行效率還有待測試。

三、JS接口:

ps:筆者用的truffle開發,還請讀者自行百度安裝開發環境。

以太坊:

  1. 首先引入相關包:

    
    import {
      default as Web3
    } from 'web3';
    import {
      default as contract
    } from 'truffle-contract';
    import my_contract from contract_path; //引入你編譯好的合約文件,truffle的是在'../../build/contract'目錄下

    具體web3以及truffle-contract可以通過npm安裝。

  1. 連接到以太坊節點(加載web3):

    
    initWeb3: function() {
        // 檢查用戶是否裝有類似matemask的插件,如果裝了則可以直接通過插件鏈接至以太坊節點
        if (typeof web3 !== 'undefined') {
          App.web3Provider = web3.currentProvider;
        } else {
          // 如果沒有,則連接至本地測試網絡,實際運行環境中則是提示用戶安裝錢包插件
          // App.web3Provider = new Web3.providers.HttpProvider('http://localhost:7545');
          alert('尊敬的用戶,您沒有安裝錢包插件,請安裝後再進行操作!')
        }
        web3 = new Web3(App.web3Provider);
      },
    1. 加載合約:

      
      var myContract = contract(my_contract); //獲取合約對象
      myContract.setProvider(web3.currentProvider);
      let myAddress = ''; //你部署的合約地址
      var contractInstance = MyContract.at(myAddress) //合約實例化
      //如果是在本地測試,則可以用以下命令:
      var contractInstance = MyContract.deployed(); //本地環境的合約實例化

      合約實例化後,然後就可以調用合約裏的方法了。

    2. 關於以太坊如何實現支付問題:

      調用合約中的有payable屬性的函數,可以發送以太幣給合約,然後通過合約裏的函數可以把以太幣轉給其他用戶。當然,也可以自己實現一個代幣,那樣就不需要用函數有payable屬性了,不過這些調用函數轉賬的過程都是需要額外交少量的gas費的。

IPFS:

  1. 引入相關包:

    
    const ipfsAPI = require('ipfs-api'); //ipfs-api可以通過npm下載
  2. 連接ipfs節點:

    
    const ipfs = ipfsAPI({
      host: 'localhost',
      port: '5001',
      protocol: 'http'
    });
  3. 上傳文件到ipfs:

    
    ipfs.add(buffer)
          .then((response) => { //response爲ipfs返回的hash,即文件所存儲的位置
            console.log(response)
            resolve(response[0].hash);
          }).catch((err) => {
            console.error(err)
            reject(err);
          })
  4. 訪問文件:

    直接訪問鏈接:http://localhost:8080/ipfs/ + hash地址 就ok了。

  5. 關於安裝啓動:

    下載地址:https://ipfs.io/docs/install/

    下載解壓後,運行install.sh 腳本就可以安裝啦。

    待安裝完成後 運行:ipfs init創建ipfs節點

    然後運行:ipfs daemon啓動服務器

    啓動後瀏覽器輸入下面的網址:

    打開http://localhost:5001/webui會看到一個漂亮的UI界面,那麼證明你已經啓動成功了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章