初入blockchain

早就听说过区块链这个技术的威名,于是不知天高低后的想去申请做一个区块链的项目,但真正接触起来才发现,这对我来说是一个挑战,但既然当初不知天高低后的吹了出去,就只有努力填坑喽!写几遍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

以太坊的白皮书

https://github.com/ethereum/wiki/wiki/White-Paper

以太坊虚拟机(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://github.com/ethereum/mist/releases/

以太坊网络
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

https://github.com/ethereum/remix-ide/

Remix提供两种方式

首先要安装npmnodejs

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,就可以开始编程了

三、区块链资源

https://mp.weixin.qq.com/s/1ZBdZfpYwqpe_Xbj0t3WOw

https://ethfans.org/