作者: AlexTan
CSDN: http://blog.csdn.net/alextan_
Github: https://github.com/AlexTan-b-z
e-mail: alextanbz@gmail.com
本教程主要讲解接口实现以及相关概念,具体实现请期待后续教程
以太坊:以太坊(Ethereum)是一个建立在区块链技术之上, 去中心化应用平台。它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。
对这句话不理解的同学,姑且可以理解为以太坊是区块链里的Android,它是一个开发平台,让我们就可以像基于Android Framework一样基于区块链技术写应用。
在没有以太坊之前,写区块链应用是这样的:拷贝一份比特币代码,然后去改底层代码如加密算法,共识机制,网络协议等等(很多山寨币就是这样,改改就出来一个新币)。以太坊平台对底层区块链技术进行了封装,让区块链应用开发者可以直接基于以太坊平台进行开发,开发者只要专注于应用本身的开发,从而大大降低了难度。
目前围绕以太坊已经形成了一个较为完善的开发生态圈:有社区的支持,有很多开发框架、工具可以选择。
智能合约:以太坊上的程序称之为智能合约, 它是代码和数据(状态)的集合。智能合约的默认的编程语言是Solidity,文件扩展名以.sol结尾。一个合约对象就相当于一个Class(类)。Solidity是和JavaScript相似的语言,用它来开发合约并编译成以太坊虚拟机字节代码。
智能合约可以理解为在区块链上可以自动执行的(由事件驱动的)、以代码形式编写的合同(特殊的交易)。
关于以太坊的更多介绍,推荐博客:以太坊是什么
IPFS:星际文件系统IPFS(InterPlanetary File System)是一个面向全球的、点对点的分布式版本文件系统,目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(HTTP),将所有具有相同文件系统的计算设备连接在一起。原理用基于内容的地址替代基于域名的地址,也就是用户寻找的不是某个地址而是储存在某个地方的内容,不需要验证发送者的身份,而只需要验证内容的哈希,通过这样可以让网页的速度更快、更安全、更健壮、更持久。
项目架构:
说明:
以太坊: 本电商平台主要用以太坊来实现用户、支付功能,以及一些小商品数据的存储。IPFS:本电商平台主要用IPFS来存储一些大文件。(目前IPFS是免费提供云存储的,ps:还可以用IPNS来免费搭建博客)
后台以及数据库:用来存储一些商品数据,减少以太坊智能合约gas费的消耗(可选,注:如果用上这一部分,那么完全去中心化的平台将变成一个半中心化的平台,会失去一些区块链本身的一些特性,比如说安全性将会降低等)
较传统WEB项目而言,就以电商平台来说,如果说做完全去中心化的平台,那么则可以完全省去后台以及数据库的开发。账户就用以太坊的账户,商品的简单属性可以通过合约存放在以太坊区块链中(这样会消耗更多的gas费),商品的具体描述、图片等大文件可以存放在ipfs中,支付等过程也可以完全通过合约来实现,不过具体运行效率还有待测试。
ps:笔者用的truffle开发,还请读者自行百度安装开发环境。
以太坊:
首先引入相关包:
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安装。
连接到以太坊节点(加载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); },
加载合约:
var myContract = contract(my_contract); //获取合约对象 myContract.setProvider(web3.currentProvider); let myAddress = ''; //你部署的合约地址 var contractInstance = MyContract.at(myAddress); //合约实例化 //如果是在本地测试,则可以用以下命令: var contractInstance = MyContract.deployed(); //本地环境的合约实例化
合约实例化后,然后就可以调用合约里的方法了。
关于以太坊如何实现支付问题:
调用合约中的有payable属性的函数,可以发送以太币给合约,然后通过合约里的函数可以把以太币转给其他用户。当然,也可以自己实现一个代币,那样就不需要用函数有payable属性了,不过这些调用函数转账的过程都是需要额外交少量的gas费的。
IPFS:
引入相关包:
const ipfsAPI = require('ipfs-api'); //ipfs-api可以通过npm下载
连接ipfs节点:
const ipfs = ipfsAPI({ host: 'localhost', port: '5001', protocol: 'http' });
上传文件到ipfs:
ipfs.add(buffer) .then((response) => { //response为ipfs返回的hash,即文件所存储的位置 console.log(response) resolve(response[0].hash); }).catch((err) => { console.error(err) reject(err); })
访问文件:
直接访问链接:http://localhost:8080/ipfs/ + hash地址 就ok了。
关于安装启动:
下载地址:https://ipfs.io/docs/install/
下载解压后,运行install.sh 脚本就可以安装啦。
待安装完成后 运行:ipfs init
创建ipfs节点
然后运行:ipfs daemon
启动服务器
启动后浏览器输入下面的网址:
打开http://localhost:5001/webui会看到一个漂亮的UI界面,那么证明你已经启动成功了。