早就听说过区块链这个技术的威名,于是不知天高低后的想去申请做一个区块链的项目,但真正接触起来才发现,这对我来说是一个挑战,但既然当初不知天高低后的吹了出去,就只有努力填坑喽!写几遍blog记录我的所学,分享出来,共同进步!
一、区块链
1.1、去中心化应用(DApp)
它是一种网络应用,后端在去中心化的点对点网络上运行,且其源代码是开源的。不存在有完全能够控制DApp的节点。
- 分布式应用:将应用分布在多个服务器上
- 账本–是一种只可增加的交易列表
- 区块链–创建去中心化账本的数据结构,用于储存数据
bitcoin白皮书 https://bitcoin.org/en/bitcoin-paper
1.2、几个常见的概念
- 公有链、联盟链和私有链
- 公有链(Public Blockchain):世界上所有人都可以发送交易,具有高度的去中心化,读写权限对所有人开放(如比特币)。
- 联盟链(Consortium Blockchain):介于公有链和私有链直接,实现了“部分去中心化”,读写权限对加入联盟的节点开放。
- 私有链(Private Blockchain):整个网络由某个组织完全控制,参与的节点具有严格的限制且少。
可以看出三种链的去中心化程度是由高到底的,公有链最高
- 记账模式
- UTXO 是“unspent transaction input/output”的缩写,指“未花费的交易输入输出”,是区块链网络中的一种记账模式,主要应用在比特币系的数字货币中,它记录的是交易事件,而不是记录最终状态.
- 账户模式即账户余额模式,主要应用于智能合约中。
- 区块链共识算法
- PoW:通过计算资源(又称算力)来决定记账权。
- PoS:通过拥有又权力的大小来决定记账权。
- DPoS:Delegated Proof of Stake 代理权益证明
二、以太坊(ethereum)
2.1、什么是以太坊
是一个去中心化的平台,可以在其上运行使用智能合约编写的DApp
以太坊的白皮书
以太坊虚拟机(EVM)可执行任意复杂算法的编码,使以太坊是“图灵完备的”
2.2、以太坊的几个基本概念
- 账户:每个账户都有一对密钥来定义,账户以地址为索引,地址为公钥的后20个字节
- 外部账户(EOA,externally owned accounts):由私人密钥控制,具有以太币的状态(即人用的账户)
- 合约账户(CA,contracts accounts):由合约代码控制(即智能合约用的账户),且只能由外部账户激活
- 交易: EOA 账户将一个经过签名的数据包发送到另外一个账户的过程,这个过程产生的账户状态变化将被存储到以太坊区块链上。
- 消息:一个合约账户调用其他合约账户的过程。
- EVM:以太坊虚拟机,用来执行以太坊智能合约字节码(类似于java的jvm)
- gas:是执行智能合约操作的燃料,智能合约的每一个步骤都会消耗 gas,gas是由以太坊的平台代币以太币转化而来
2.3、搭建以太坊开发环境
geth(go-ethereum)为以太坊的go语言客户端,geth官方安装指南:
https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum
创建一个账户
geth account new //会让你输入pw,由于账户没有找回密码的选项,请务必记住密码
或者使用
geth --password ./password account new
geth account list //列出keystore文件夹中所有账号
密钥文件在:~/.ethereum/keystore/中
Geth Console一个交互式的 JavaScript 执行环境
geth console 2>> file_to_log_output //进入交互式并输出日志
> eth.accounts //列出账号
["0x87c9207d37e9cc2ee8bae158ea922b131f5f6edb"]
>personal.newAccount("password")
tail -f file_to_log_output //查看日志
- eth:包含一些跟操作区块链相关的方法
- net:包含以下查看p2p网络状态的方法
- admin:包含一些与管理节点相关的方法
- miner:包含启动&停止挖矿的一些方法
- personal:主要包含一些管理账户的方法
- txpool:包含一些查看交易内存池的方法
- web3:包含了以上对象,还包含一些单位换算的方法
https://github.com/ethereum/go-ethereum/wiki/Managing-your-accounts
Mist浏览器(已经集成以太坊钱包)
以太坊网络
https://ethstats.net/
中显示了以太坊网络中实时的数据
> net.listening //显示是否在监听的节点
true
> net.peerCount //对等端点的数量
0
> admin.peers //返回已连接的对等端点的列表
> admin.nodeInfo
2.4、编写智能合约
通过编写智能合约,我们可以让以太坊网络执行我们所设定的内容,我将采用solidity
这门语言来编写合约代码(这门语言与javascript
很像),当然EVM
其实支持多种语言,不过主流是solidity
,编写出来的文件是以.sol
为后缀的,编写完成后编译成为字节码供EVM
执行
solidity官方文档:https://solidity.readthedocs.io/en/latest/
安装solidity
编译器
官网中提供了多种安装方法,这里采用二进制包来安装
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
安装成功后,输入solc --help
可查看相应的选项
除了这种方法外,常见的是使用以太坊提供的Browser Solidity
一种在浏览器上的适用于小型合约的IDE,solidity
官方文档中推荐使用Remix
Remix
提供两种方式
- 直接通过浏览器访问https://ethereum.github.io/browser-solidity/进行在线编写
- 本地安装
首先要安装npm
和nodejs
sudo apt-get install npm
npm install -g npm //用于更新npm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash //下载并安装nvm用于安装nodejs
export NVM_DIR="${XDG_CONFIG_HOME/:-$HOME/.}nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" //导入nvm
nvm install node
node -v
nvm为nodejs的包管理器,Node.js 就是运行在服务端的JavaScript
。
安装remix
npm install remix-ide -g
remix-ide
浏览器打开http://127.0.0.1:8080,就可以开始编程了