Elwin随心 2017-12-05
区块链技术概览
一、区块链主要组织
1、R3区块链联盟(全球顶级金融机构)
用以太坊和微软Azure技术,将11家银行连接至分布式私人账本Corda
源代码 https://github.com/corda/corda
实现语言 Kotlin(JVM)
2、超级账本hyperledger (代表技术极客)
Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目。主要实现形式是IBM的开源项目fabric(golang实现)
源代码
go版本(功能最全)
https://github.com/hyperledger/fabric
c++版本
https://github.com/hyperledger/iroha
python版本(功能很少)
https://github.com/hyperledger/sawtooth-core
浏览器
https://github.com/hyperledger/blockchain-explorer
3、金融区块链联盟(代表国内民间组织)
微众银行、京东金融、华为、恒生电子等民营企业的联盟。
4、China Ledger联盟(代表监管部门)
中国分布式总账基础协议联盟
5、微链盟(区块链微金融产业联盟)
面向网贷行业,聚焦 征信、结算、交易、资产登记、数据共享等。
6、银行间市场区块链技术研究组
大银行之间的联盟
二、主要历史
0、经济学、密码学分布式系统的基础
1976, 哈耶克《货币的非国家化》
1976年,Bailey W. Diffie、Martin E. Hellman《密码学的新方向》
1982, 大卫·乔姆提出了密码学支付系统ECash
1985年,Koblitz和Miller各自独立提出了著名的椭圆曲线加密(ECC)算法
1997年,HashCash方法,也就是第一代POW(Proof of Work)算法出现。
1982年,Lamport提出拜占廷将军问题;
1998年,戴伟(Wei Dai)、尼克·萨博同时提出密码学货币的概念。
1、区块链的第一个时代 2009-2013年(bitcoin)
中本聪用c++实现的比特币的源代码
https://github.com/bitcoin/bitcoin
修改比特币的源代码,自己发行新的货币,特点是:一个货币一个链
2、区块链的第二个时代 2013-2014年(NXT/BTS)
基于比特币发行代币,实现交易所。技术上是扩展了比特币的协议。特点是:新的货币使用原来的比特币区块链。
3、区块链的第三个时代(以太坊)
可编程区块链时代(智能合约),典型数据货币就是以太币。技术上区块链不仅是一个可靠的一致性的数据库,也提供图灵完备的evm,这里的想象空间无限大。
三、基本概念
0、blockchain:技术上是一个全局共享,分布式的,不可篡改的,基于时间的,基于签名的数据库。本质是互联网数据层次的技术。现在的发展趋势是公有链->侧链->联盟链 。
1、Permissioned blockchain networks(联盟链):有少数的验证节点可以记账(矿工),少数的节点可以创建合约和交易,只处理自己感兴趣的app;可管理;花销少
2、SPV Simplified Payment Verification(简单支付验证),不运行完全节点也可验证支付(使用所有历史块的hash)
3、ecosystem_applications:
协作方式的演变:自建数据中心->租用云平台->自组织的生态系统(解决人和资源的组织的问题)
4、Smart Contracts:除了能进行转账,还能够编程控制,实现的智能合约可以实现自组织和自动化。
5、比特币、以太坊、超级账本 的区别:
比特币:公有链
超级账本(IBM fabric):联盟链 (Permissioned blockchain),使用docker来运行合约,没有代币,2B
以太坊:带有evm的公有链
Corda:联盟链
6、Legal Engineering:利用代码保证权力和义务
7、monax hyperledger burrow Ethereum 之间的关系
Ethereum:核心开发者原来是搞比特币的,是技术上对bitcoin的升级
hyperledger: 定义白皮书、黄皮书等标准
burrow:符合ethereum虚拟机标准的,hyperledger的实现
monax:对burrow进一步封装,使得开发和部署智能合约更容易
8、openchain:比特币侧链上的资产实现
使用分区共识,专攻产权登记,代码实现比较简陋(C#实现)
四、技术概述
1、底层区块链技术:
主要有bitcoin、Corda、fabric(hyperledger)、Ethereum、bcos(对ethereum进行了扩展)
bcos是腾讯微众银行搞的东西,7月份刚刚开源。
相关网址:
https://github.com/bitcoin/bitcoin
https://github.com/corda/corda
https://github.com/hyperledger/fabric
https://github.com/ethereum/go-ethereum
https://github.com/bcosorg/bcos
实现语言依次是 c++、Kotlin(JVM)、golang、golang、c++
2、区块链的基本层次结构:
数据层、p2p网络层、共识和激励、合约、应用。
其中数据层主要是block数据结构;共识和激励机制解决谁可以记账,怎么记账,怎么防备攻击,怎么给予奖励等一系列的问题,是整个技术栈的核心;合约层提供了使用区块链的接口,是应用开发人员接触的主要部分。
五、以太坊相关
1、与比特币的区别:
比特币:用私钥加密来发送一个交易,旷工通过工作量证明,一起进行记账。
以太坊:直接的转账和验证-->代码+外存+基于vm的验证;交易->合约
2、基本概念:
外部账户:公钥代表的账户,与比特币类似,以私钥转账或处罚合约。
合约账户:用于合约执行的账户,有自己的永久状态,可以调用其它的合约。在外部账户创建和发布合约时创建。
3、主要组件
Swarm实现了分布式存储,Whisper实现了分布式消息
4、内置货币
以太币:以太坊官方发布的货币,不像比特币只能挖矿产生。1 ether = 10^8 wei 。发布合约和执行合约都需要支付以太币
5、基本控制方式
人->外部账户(激活)->合约账户
6、spv
简化支付确认(SPV)使用默克尔树的头部的hash来实现
合约执行的过程:检查、扣币、执行合约和消耗币、返回剩余
7、log
log是写在block上,evm不能访问,外部可以访问,
六、以太坊智能合约的抽象
1、编程语言solidity。
2、静态类型、支持继承、库和用户定义类型。runtime不能使用随机数和网络,数据持久化环境是区块链。VM是图灵完备的。
2、区块链整体是基于交易的状态机。
3、transaction=receiver+sender+nonce +value + data +GAS
4、API抽象
1》代码context是所属区块在区块链上的位置和所有可用数据。
2》所有合约继承address类,内部包含balance transfer send
3》所有contract可以使用的全局变量,block msg tx
5、常见的功能
可靠存储数据;
复杂的访问策略;
多个参与方的协调;
七、以太坊相关的编译和安装
solc 编译器
1、 docker镜像方式 (/usr/local/bin/)
docker run ethereum/solc:stable solc --version
solc --optimize --bin sourceFile.sol
2、源代码编译安装
git clone https://github.com/ethereum/solidity.git
cd solidity
mkdir build
cd build
# gcc
yum install centos-release-scl-rh centos-release-scl
yum check-update
yum install devtoolset-3-gcc devtoolset-3-gcc-c++
source /opt/rh/devtoolset-3/enable
scl enable devtoolset-2 bash
# cmake
sudo yum -y remove cmake
sudo yum -y install cmake3
sudo ln -s /usr/bin/cmake3 /usr/bin/cmake
# boost
tar zxvf boost_1_61_0.tar.gz
sudo ./bootstrap.sh --prefix=/usr/local/include/boost
sudo ./b2 install
# make
cmake .. -DBOOST_ROOT=/usr/local/include/boost && make
编译结果 build/solc/
编译和安装geth
yum install golang
git clone https://github.com/ethereum/go-ethereum.git
make all
可执行文件在 build/bin/
c++客户端编译
https://github.com/ethereum/cpp-ethereum
git clone --recursive https://github.com/ethereum/cpp-ethereum.git
yum install leveldb-devel libmicrohttpd-devel
mkdir build; cd build
cmake ..
cmake --build .
编译结果在每个子目录中
八、创建以太坊私有链
1、创建和初始化创世块(重要的配置是chainId和nonce)
vi genesis.json
geth --datadir /root/workspace/blockchain/wtm init /root/workspace/blockchain/wtm/genesis.json
2、启动bootnode
./bootnode --genkey=boot.key 生成bootnode的key文件
./bootnode --nodekey=boot.key
enode://0955c689956db831a134f58a3ad8abf165d08cb1ed892777bd57f58cbbd145bcbc3ff54edfb7d2a1b074b842040362fd80e7dc99ecd497c3deb34cc8d09af13a@10.88.102.203:30301
3、启动节点
geth --datadir /root/workspace/blockchain/wtm --identity "Wtmetherum" --rpc --rpccorsdomain "*" --port "30303" --rpcapi "personal,db,eth,net,web3" --bootnodes="enode://0955c689956db831a134f58a3ad8abf165d08cb1ed892777bd57f58cbbd145bcbc3ff54edfb7d2a1b074b842040362fd80e7dc99ecd497c3deb34cc8d09af13a@10.88.102.203:30301" console
4、console中创建账户
personal.newAccount('123')
eth.accounts
"0xaf588a79cd0b97735541618296ac4dad5fc5e739"
5、确性节点信息 admin.nodeInfo
enode://a0928b4a39db829721732dfba1e2900474dfe1184463b89f0311b4101a242f5767bc6829dd05f10899beeb03556b4e54303719d3782cfc2217b75ce070c6f80e@[::]:30303
6、打开防火墙
firewall-cmd --zone=public --add-port=30301-30303/tcp
7、windows节点 初始化和启动节点
"D:\Program Files\Geth\geth.exe" --datadir D:\block init D:\block\genesis.json
"D:\Program Files\Geth\geth.exe" --datadir D:\block --bootnodes="enode://0955c689956db831a134f58a3ad8abf165d08cb1ed892777bd57f58cbbd145bcbc3ff54edfb7d2a1b074b842040362fd80e7dc99ecd497c3deb34cc8d09af13a@10.88.102.203:30301" console
命令行中添加centos节点
admin.addPeer('enode://a0928b4a39db829721732dfba1e2900474dfe1184463b89f0311b4101a242f5767bc6829dd05f10899beeb03556b4e54303719d3782cfc2217b75ce070c6f80e@10.88.102.203:30303')
8、centos节点中,检查节点,并挖矿
admin.peers
miner.start()
九、以太坊智能合约开发和部署
1、编译solidity代码
https://remix.ethereum.org/#version=soljson-v0.4.18+commit.9cf6e910.js
pragma solidity ^0.4.0;
contract Calc{
uint count;
function add(uint a, uint b) returns(uint){
count++;
return a + b;
}
function getCount() constant returns (uint){
return count;
}
}
2、解锁
personal.unlockAccount(eth.accounts[0], '123')
3、提交 (从上面url的web3 deploy中粘贴)
var contract = web3.eth.contract(
[
{
"constant": false,
"inputs": [
{
"name": "a",
"type": "uint256"
},
{
"name": "b",
"type": "uint256"
}
],
"name": "add",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getCount",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]
);
var browser_ballot_sol_calc = contract.new
(
{
from: web3.eth.accounts[0],
data: '0x6060604052341561000f57600080fd5b6101048061001e6000396000f3006060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063771602f714604e578063a87d942c14608b575b600080fd5b3415605857600080fd5b6075600480803590602001909190803590602001909190505060b1565b6040518082815260200191505060405180910390f35b3415609557600080fd5b609b60cf565b6040518082815260200191505060405180910390f35b60008060008154809291906001019190505550818301905092915050565b600080549050905600a165627a7a7230582099f3b315c789271305be39e69765732d657538c5f3572ebc8211d865be941e660029',
gas: '4700000'
},
function(e, contract) {
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' +
contract.address +
' transactionHash: ' + contract.transactionHash);
}
})
Submitted contract creation fullhash=0x1df110662cb746c28533cc0b8d70023947f83aa0d500716936592f465307835b contract=0x0A50fb7A7d88D68E40804E304Eb50fEd6c1464B9
txpool.status
4、挖矿确认(提交合约)
miner.start()
提示
Contract mined! address: 0x0a50fb7a7d88d68e40804e304eb50fed6c1464b9 transactionHash: 0x1df110662cb746c28533cc0b8d70023947f83aa0d500716936592f465307835b
5、调用合约
var abi = web3.eth.contract(
[
{
"constant": false,
"inputs": [
{
"name": "a",
"type": "uint256"
},
{
"name": "b",
"type": "uint256"
}
],
"name": "add",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getCount",
"outputs": [{
"name": "",
"type": "uint256"
}],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]
);
instance = abi.at(['0x0a50fb7a7d88d68e40804e304eb50fed6c1464b9'])
1》本地调用方式:
instance.add.call(1,2)
2》区块链调用方式:
personal.unlockAccount(eth.accounts[0], '123')
instance.add.sendTransaction(1, 3, {from:eth.accounts[0]})
6、console命令汇总
admin.addPeer('enode://a0928b4a39db829721732dfba1e2900474dfe1184463b89f0311b4101a242f5767bc6829dd05f10899beeb03556b4e54303719d3782cfc2217b75ce070c6f80e@10.88.102.203:30303')
admin.peers
personal.newAccount('123')
eth.getBalance("0x04c59b370ccd73403410ececa09f319b60aed10a")
personal.unlockAccount(eth.accounts[0], '123')
txpool.status
miner.start()
miner.stop()
eth.getTransaction("0x1df110662cb746c28533cc0b8d70023947f83aa0d500716936592f465307835b")
十、monax安装和开发
1、安装:(monax+docker)
sudo curl -L https://pkgs.monax.io/dl/monax-0.18.0-linux-amd64 >/usr/local/bin/monax
sudo chmod +x /usr/local/bin/monax
docker pull quay.io/monax/keys
monax init # 会自动去docker pull
2、基本命令
monax chains start NAME --init-dir ~/.monax/chains/NAME/ACCOUNT
monax chains make test_chain
monax chains start test_chain --init-dir ~/.monax/chains/test_chain/test_chain_full_000
monax ls
monax chains logs test_chain
monax chains stop test_chain
monax chains rm -xfd test_chain
monax clean -yx # 删除所有自己创建的chain
monax services start keys
monax services start compilers
3、基本介绍
services — 容器服务
chains — develop permissioned chains
pkgs — 合约打包、部署工作(通过ethereum的rpc调用)
keys — 维护钥匙串
monax keys gen
4、开发步骤
1、创建和启动 burrow node
chain_dir=$HOME/.monax/chains/firstchain
chain_dir_this=$chain_dir/firstchain_full_000
monax chains make firstchain --account-types=Root:2,Full:1 --unsafe
monax chains start firstchain --init-dir $chain_dir_this
monax chains start firstchain --init-dir /root/.monax/chains/firstchain/firstchain_full_000/
2、创建、发布和测试contract
addr=$(cat $chain_dir/addresses.csv | grep firstchain_full_000 | cut -d ',' -f 1)
cd /root/.monax/apps/
mkdir idi
cd idi
创建 sol和yaml文件
monax pkgs do --chain firstchain --address $addr
3、合约和配置文件例子
写contract, constant 表示只读
pragma solidity ^0.4.0;
contract IdisContractsFTW {
uint storedData;
function set(uint x) {
storedData = x;
}
function get() constant returns (uint retVal) {
return storedData;
}
}
十一、openchain相关(比特币侧链上的资产实现)
Partionned Consensus:分区共识,专攻产权登记
1、技术实现:
server:
c#实现
client:html web项目
1》交易数据结构 Record Mutation Transaction
2》账本 怎么组织record
a 按着账户区分,每个记录的key是 path:type:name
/p2pkh/mfiCwNxuFYMtb5ytCacgzDAineD2GNCnYo/:ACC:/asset/p2pkh/n15g8F3sVLufwvPmmX7tYPWrGGbGSbcaEB/
b ACC 代表当前余额 DATA 任意的元数据
2、配置server
git clone https://github.com/openchain/docker.git openchain
cd openchain
cp templates/docker-compose-direct.yml docker-compose.yml
mkdir data
cp templates/config.json data/config.json
vi data/config.json
docker-compose up -d
docker logs openchain-server
3、配置web
firewall-cmd --zone=public --add-port=8080-8081/tcp
git clone https://github.com/openchain/wallet.git openchain_wallet
cd openchain_wallet/www
python -m SimpleHTTPServer 8081
4、浏览器测试
http://10.88.102.203:8081
url里面填写 http://10.88.102.203:8080
pwd:
color pass plunge silver stamp churn blind tape category hobby enhance crew
path:
/p2pkh/XfYbJaANf6cDz6PNmpxE4Mx5tJNoSAHNoK/
十二、corda 开发环境搭建:
git clone https://github.com/corda/cordapp-example
cd cordapp-example
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64/
gradlew deployNodes
kotlin-source/build/nodes/runnodes
十三、bcos开发环境
1、编译
https://github.com/bcosorg/bcos
sudo yum install -y nodejs
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
sudo cnpm install -g babel-cli babel-preset-es2017
echo '{ "presets": ["es2017"] }' > ~/.babelrc
#install solc
wget https://github.com/ethereum/solidity/releases/download/v0.4.13/solc-static-linux
sudo cp solc-static-linux /usr/bin/solc
sudo chmod +x /usr/bin/solc
#install console
sudo cnpm install -g ethereum-console
#install deps
sudo yum -y install cmake3
sudo yum install -y openssl openssl-devel
#chmod +x scripts/install_deps.sh
#./scripts/install_deps.sh
yum install -y leveldb-devel libmicrohttpd-devel
yum install -y curl-devel libmicrohttpd-devel gmp-devel
yum install miniupnpc
tar -jxvf boost_1_65_1.tar.bz2
cd boost_1_65_1
./bootstrap.sh
./b2 install # 目录是/usr/local/boost
cd ..
#build bcos
mkdir -p build
cd build/
cmake3 -DEVMJIT=OFF -DTESTS=OFF -DMINIUPNPC=OFF ..
make -j2
make install
cd ..
cd ./tool
cnpm install
ldd eth/bcoseth # 检查需要的so
echo '/usr/local/include/boost/lib' > /etc/ld.so.conf.d/libboost-x86_64.conf
cp build/bcoseth /usr/local/bin/bcoseth
2、生成公钥(节点
mkdir -p /mydata/nodedata-1/
mkdir -p /mydata/nodedata-1/data/
mkdir -p /mydata/nodedata-1/log/
mkdir -p /mydata/nodedata-1/keystore/
bcoseth --gennetworkrlp /mydata/nodedata-1/data/network.rlp
得到公钥 '559337ca6936564cba935f77c0398bcf5525f235a231e6a5ef23b3153d484c8ff25fb1918871c6a17e0603a68b6db459ebcd8608ac45c76e5f80bfa081d70a9e'
修改genesis.json
"initMinerNodes":[""] 为这个值
修改config.json
"NodeextraInfo":Nodeid 为这个值
3、管理员钥匙对
cd tool
cnpm install
node accountManager.js
输出:
privKey : 0xaf52310f39389629b7ee032e8e23a440a2a93cfc706dea687741481fda606cf5
pubKey : 0x5d5fb070d907a5658972b50cc63fcd1dc116e387cf8cdde09bb196b77c3dd576b4f50e5bbd5742c5e678d98a4ff3ef11fae9e6626743fcee4dd4e436718cb7d9
address : 0xe50d2d5bbc7d86e758a5be55d5a2580b1d7f122b
将公钥pubKey更新到创世块文件genesis.json的god字段。
4、启动
cp genesis.json config.json log.conf /mydata/nodedata-1/
cd /mydata/nodedata-1/
bcoseth --genesis ./genesis.json --config ./config.json
tail -f /mydata/nodedata-1/log/trace_log* | grep "|eth"
5、部署合约
cd tool
cnpm install
vim config.js
修改(上面生成的god账户)
privKey:"af52310f39389629b7ee032e8e23a440a2a93cfc706dea687741481fda606cf5",
account:"0xe50d2d5bbc7d86e758a5be55d5a2580b1d7f122b"
babel-node deploy.js HelloWorld
HelloWorld合约地址 0xcad8f9dc9695e0ce8a8557cf41c73f70a0cc83c0
6、调用
babel-node demoHelloWorld.js
7、使用 console
ethconsole /mydata/nodedata-1/data/geth.ipc
web3.eth.getBlock(1,console.log)
web3.eth.getTransaction('0x32e0709333c03146757f4a241f2616cdfbb17eb45fcb69bb22f9537f4bd4e04c',console.log)
web3.eth.getTransactionReceipt('0x32e0709333c03146757f4a241f2616cdfbb17eb45fcb69bb22f9537f4bd4e04c',console.log)
web3.eth.getCode
('0xcad8f9dc9695e0ce8a8557cf41c73f70a0cc83c0',console.log)
web3.admin.getPeers(console.log)