`
eric_weitm
  • 浏览: 243539 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

区块链技术概览

 
阅读更多

区块链技术概览

一、区块链主要组织

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)

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics