区块链技术概览
一、区块链主要组织
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)
相关推荐
#资源达人分享计划#
2021年区块链应用概览.pdf
区块链技术,作为一项颠覆性的信息技术,在全球范围内受到了广泛关注。2019年,中国区块链行业处于加速发展和创新的2.0时代,行业规模虽小但增长迅速,企业数量众多,且大部分企业仍处于早期创业阶段。这个阶段,...
区块链技术软件开发实践:区块链及其核心技术概览.docx区块链技术软件开发实践:区块链及其核心技术概览.docx
#### 区块链技术概览 区块链技术作为一项颠覆性技术,在近年来迅速崛起,并在全球范围内引起了广泛关注。它不仅在金融领域有着广泛应用,还在诸多其他行业中展现出巨大潜力。本次项目旨在通过多层次、跨学科的方式...
重磅,区块链技术及行业应用资料合集,共40份。 2019年中国区块链行业精品报告 2020-2021年中国区块链产业发展报告白皮书 2020-2021全球区块链产业全景与趋势 2020-2021中国区块链产业生态地图报告 2020《区块链VS...
#### 区块链技术概览 区块链是一种分布式的数据库技术,能够确保数据的安全性、透明度和不可篡改性。这项技术最初是为支持加密货币比特币而设计的,但其潜在的应用远不止于此。随着技术的发展,区块链正在被广泛...
区块链技术,作为一种分布式网络数据管理技术,通过密码学和分布式共识协议确保网络的安全性和数据的不可篡改性。它的核心特点包括数据的多方维护、交叉验证以及全网一致性,这使得区块链成为建立跨产业主体间信任...
区块链技术作为近年来信息科技领域的重大创新,在全球范围内逐渐得到了应用与推广。在中国,区块链行业的发展尤其受到了政府政策的大力支持和市场的高度关注。本报告深入分析了2019年中国区块链行业的整体情况,包括...
- **区块链技术概览**:区块链技术作为一种新兴的信息记录与共享技术,具备去中心化、透明性和不可篡改等特性,这使其在诸多领域展现出广阔的应用前景。自2008年比特币的出现以来,区块链技术逐渐引起了全球的关注,...
区块链技术,作为一种分布式网络数据管理技术,通过密码学和分布式共识协议确保数据的安全传输和访问,实现了多方共同维护、交叉验证以及全网数据的一致性,具有高度的防篡改特性。这一技术作为新一代信息通信技术的...
#资源达人分享计划#
### 区块链技术概览 #### 标题:“区块链开发视频教程(云盘)” - **区块链开发**: 指的是围绕区块链技术进行软件开发的过程。这不仅包括创建新的区块链平台,也涵盖基于现有区块链的应用开发。 - **视频教程**: ...
2020年区块链技术在中国支付清算领域的应用概览.pdf
区块链行业:2019年区块链技术构建供应链金融新生态概览
2019年区块链技术构建供应链金融新生态概览
20200430-区块链行业:2020年区块链技术在中国支付清算领域的应用概览
中国区块链行业概览报告深入研究了2019年中国的区块链应用和市场发展情况,从区块链技术定义、核心技术特征、行业发展历程、企业分布情况、市场驱动因素、风险挑战、政策法规、行业发展趋势以及竞争格局等多个维度...