“我总偏向将权利分散于网络。这样一来,就没任何组织能轻松获取控制。我不相信巨大的中央组织,天性使然。”——Bob Tayor, ARPANET缔造者
本文原创发表于所问HT前端团队,原文地址:http://ht.askingdata.com/article/5af91967ab8f0f686da0d11d
今年年初的“三点钟区块链群”彻底激起了以加密数字货币的主的区块链浪潮,资本的驱动加深了人们对区块链技术的狂热。然而,作为区块链3.0的时代的更广的应用来临,技术如何落地也是在初期需要解决的第一道坎。
所以今天就来试一下如何在以太坊上建立智能合约应用(Dapp),开发一个普通应用的该有的登录注册,以便我们第一时间尝鲜。
为什么要使用区块链?
作为一名标准的web开发人员,在开始一门新技术之前,需要仔细考虑一个问题就是:基于现有的业务如果用上区块链会更好吗?
回答这个问题之前,你需要了解区块链是什么?优势是什么?这个问题就不在这里展开了,这是个相当大的话题,不清楚的同学可以移步到这里参考一下。《区块链-百度百科》、《区块链技术是什么?未来可能用于哪些方面?》
那么区块链本质上就是一个去中心化的数据库,只不过这个数据库没有中心服务器、数据无法篡改同时一定程度上能够很好的保护数据隐私。对如今的互联网来说,听起来很具有革命性的技术。所以如果对于一款涉及到数据私密性、永久性安全性高的应用,这个确实是非常适合的。
现在在金融、医疗、溯源、社交等等领域,很多公司逐渐开始试水更广泛的应用。而只靠发币炒币,这毕竟是种投机取巧的行为。
以太坊入门必备基础
接下来将会从零开始搭建基于以太坊web3js项目,开始阅读之前,你需要熟练前端或后台JavaScript语法,熟悉区块链思想和原理,如果能了解solidity语法更好,因为接下来我们会用到它,和js很像的一门语言。
为了能够方便大家能够快速的了解,提供了下面几个资料供参考:
- 《ethereum官网》以太坊官网。
- 《sails官方文档》一款后台的nodejs框架。
- 《 we3.js 文档1.0版本》以太坊上的前端框架,可实现与合约交互。
- 《solidity 文档》以太坊的智能合约语言,熟悉常用语法,和JavaScript语法类似。
了解上面的知识之后,就可以开始DAPP搭建之旅了,将从下面的路线讲解:
- 搭建以太坊环境。
- 创建创世区块。
- 简单的挖矿、创建账户。
- 利用以太坊钱包查询账户信息。
- 编写智能合约。
- web3.js与合约交互。
- 登录注册业务逻辑实现。
- postman接口测试
项目代码可点击查看https://github.com/Elliottssu/web3js-api
一、以太坊环境搭建
如果已经有以太坊环境的同学可以跳过,接下来以mac系统为例介绍,windows也差不多。
通过Homebrew来安装go-ethereum
brew tap ethereum/ethereum
可以添加–devel以下命令来安装开发分支(建议用这个):
brew install ethereum --devel
执行geth version
查看版本号,如果正常的话即安装成功。
二、新建创世区块
在比特币系统里,这个创世块是被写入源码,但对于以太坊而言,创世块可以是任何你喜欢的东西。你也可以把这个当成是系统的一个漏洞。但是共识算法确保其它人除非纳入你的创世块,否则是不会有效的。
创世区块的目的是搭建私有链,作为链上的第一个块,如果直接运行节点的话会同步公链的数据,数据量会非常大。如果想在同一个网络中获取数据,创世区块也必须要一样。
新建genesis.json文件内容如下:
{
"config": {},
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x100",
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x00",
"gasLimit": "0xffffffffffff"
}
上面定义了一些如挖矿难度、以太币数量、gas消耗限制等等信息。
在当前目录下执行geth init genesis.json
来初始化创世区块节点。
至此,环境配置方面已经完成。我们可以通过下面这个命令在8545端口来启动节点:
geth --rpc --rpccorsdomain "*" --rpcapi "personal,web3,eth,ne