zoukankan      html  css  js  c++  java
  • 五分钟搭建你的第一个区块链应用

    为什么要学点区块链知识?看看马云在刚刚过去的第二届世界智能大会上怎么说。

    言归正传。

    提起区块链,人们自然会想到比特币。比特币或许是泡沫或许不是,但比特币背后的区块链技术绝不是泡沫,且极具颠覆力。今天各大科技巨头 都在积累区块链技术和专利。山雨欲来风满楼,区块链技术应用场景的爆发即使不在当下,也近在眼前。区块链开发人员的薪水也已登上了金字塔尖,这才是我们要学习区块链技术的真正原因。

    本文将首先介绍比特币和区块链背后的关键技术点,然后解释以太坊智能合约对区块链技术的改进,最后讲解如何使用超级账本项目创建简易的区块链银行转账系统。

    该区块链银行转账系统已同步发布在了 [ 行云趣码开发云平台 ] 的应用商店,在开始接下来的阅读之前,您可以先登录平台部署并感受一下该系统。

    http://mart.cloudtogo.cn/app/detail.html?appId=A18060706112077200000010143570  (PC浏览更美好!)

    从拜占庭将军说起

    拜占庭将军(Byzantine Generals Problem)问题,是 Leslie Lamport 1982 年提出用来解释一致性问题的一个虚构模型。拜占庭是古代东罗马帝国的首都,由于地域宽广,守卫边境的多个将军(系统中的多个节点)需要通过信使来传递消息,达成某些一致的决定。但由于将军中可能存在叛徒(系统中节点出错),这些叛徒将努力向不同的将军发送不同的消息,试图会干扰一致性的达成。

    拜占庭问题即为在此情况下,如何让忠诚的将军们能达成行动的一致。这是分布式系统核心问题之一。拜占庭问题之所以难解,在于任何时候系统中都可能存在多个提案(因为提案成本很低),并且要完成最终的一致性确认过程十分困难,容易受干扰。但是一旦确认,即为最终确认。

    比特币网络中的矿机 

    比特币网络的唯一功能就是"转账",该系统中比特币的上限被设定为2100万个。这些比特币是如何被"挖"出来的呢?答案是记账奖励。比特币网络中的矿机(计算机)就是记账员,记账员每完成一次记账就能获得一定的比特币奖励,俗称挖矿收入。

    比特币产生速度每4年减半,所以挖矿获得的比特币会越来越少,直到零。之后需要从转账者那里收取转账手续费维系矿机的运转,就像普通商业银行收取用户转账的手续费。

    比特币网络中的矿机,其角色等同于拜占庭问题中的将军。当用户发起比特币转账时,矿机就会试图就该交易达成共识,就像拜占庭将军们一样,达成共识需要有矿机发起提案,有矿机进行表决(背书),在比特币网络中只有发起提案的矿机才能获得挖矿收入。谁会获得发起提案的机会呢?

    比特币的区块链网络在设计时提出了创新的 PoW(Proof of Work)算法思路。一个是限制一段时间内整个网络中出现提案的个数(增加提案成本),另外一个是放宽对最终一致性确认的需求,约定好大家都确认并沿着已知最长的链进行拓宽。系统的最终确认是概率意义上的存在。这样,即便有人试图恶意破坏,也会付出很大的经济代价(付出超过系统一半的算力)。

    矿机都在争夺提案的机会,他们同时求解同一道数学题,最先交卷的矿机将赢得本次提案的机会。数学题(示意版)如下:

    hash (上一个区块的hash值 + 随机数) < 00000000000FFFFFFFFFFFFFFFFFFFFF

    比赛开始后,矿机把上一个区块的hash值加上不断尝试的随机数,重新计算hash,直到hash的结果小于某个值时,求解成功。比特币网络会自动调整求解难度,即调整不等式右边hash值的大小,把提案频率控制在10分钟左右。

    以太坊的智能合约

    智能合约(Smart Contract)是以太坊中最为重要的一个概念,即以计算机程序的方式来缔结和运行各种合约。最早在上世纪 90 年代,Nick Szabo 等人就提出过类似的概念,但一直依赖因为缺乏可靠执行智能合约的环境,而被作为一种理论设计。区块链技术的出现,恰好补充了这一缺陷。

    智能合约作为运行在以太坊虚拟机(Ethereum Virtual Machine,EVM)中的应用,可以接受来自外部的交易请求和事件,通过触发运行提前编写好的代码逻辑,进一步生成新的交易和事件,可以进一步调用其它智能合约。智能合约的执行结果可能对以太坊网络上的账本状态进行更新。这些修改由于经过了以太坊网络中的共识,一旦确认后无法被伪造和篡改。

    比特币网络中的转账和以太坊的智能合约,类似功能机和智能手机,前者只能运行预置的软件(比特币网络的转账),后者可以安装各种APP (以太坊的智能合约)。智能手机带来的颠覆无需赘言,同样,只需看一下ICO市场的躁动就能窥见智能合约带来的改变。

    私有链和超级账本项目

    由IBM和Linux基金会主导的超级账本(Hyperledger)项目,是开发私有链和联盟链的不二之选。该项目下有很多子项目,比如最重要的Fabric项目,提供区块链运行的基础支撑;Composer项目简化了智能合约(Hyperledger中称为chaincode)的开发和部署。

    在刚刚结束的ThoughtWorks技术雷达峰会上,ThoughtWorks也将Hyperledger列为推荐的框架。

    使用超级账本搭建区块链银行转账系统

    该系统的区块链网络部分包括一个CA节点(证书颁发和管理体系),一个Orderer节点(分布式决策中的Proposer),三个Peer节点(用作信用背书)以及三个对应的数据库(存储World State)。另外包含两个业务节点,负责定义并实现业务,并将业务部署在Fabric网络中,同时提供RESTful接口和UI。该系统出于技术演示的目的而创建,所以不具备完整银行应用中的诸多功能,比如账户、密码等权限等。如下图所示:

    该区块链系统已同步发布在了 [ 行云趣码开发云平台 ] 的应用工厂,在开始接下来的阅读之前,您可以创建项目并在模板中选择“区块链银行系统”,只需要几分钟,就可将一切部署到云端,快速地感受一下基于区块链技术所构建的应用。

    http://factory.cloudtogo.cn/

    以下是该系统开发的具体步骤。

    一、安装Fabric和Composer

    准备一台Ubuntu16.04虚拟机,以非root用户执行下面的脚本,安装Fabric和Composer依赖的运行环境。

    #!/bin/bash

    #./prereqs-ubuntu.sh

    # Exit on any failure

    set -e

    # Array of supported versions

    declare -a versions=('trusty' 'xenial' 'yakkety');

    # check the version and extract codename of ubuntu if release codename not provided by user

    if [ -z "$1" ]; then

    source /etc/lsb-release ||

    (echo "Error: Release information not found "; exit 1)

    CODENAME=${DISTRIB_CODENAME}

    else

    CODENAME=${1}

    fi

    # check version is supported

    if echo ${versions[@]} | grep -q -w ${CODENAME}; then

    echo "Installing Hyperledger Composer prereqs for Ubuntu ${CODENAME}"

    else

    echo "Error: Ubuntu ${CODENAME} is not supported"

    exit 1

    fi

    # Update package lists

    echo "# Updating package lists"

    sudo apt-add-repository -y ppa:git-core/ppa

    sudo apt-get update

    # Install Git

    echo "# Installing Git"

    sudo apt-get install -y git

    # Install nvm dependencies

    echo "# Installing nvm dependencies"

    sudo apt-get -y install build-essential libssl-dev

    # Execute nvm installation script

    echo "# Executing nvm installation script"

    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

    # Set up nvm environment without restarting the shell

    export NVM_DIR="${HOME}/.nvm"

    [ -s "${NVM_DIR}/nvm.sh" ] && . "${NVM_DIR}/nvm.sh"

    [ -s "${NVM_DIR}/bash_completion" ] && . "${NVM_DIR}/bash_completion"

    # Install node

    echo "# Installing nodeJS"

    nvm install --lts

    # Configure nvm to use version 6.9.5

    nvm use --lts

    nvm alias default 'lts/*'

    # Install the latest version of npm

    echo "# Installing npm"

    npm install npm@latest -g

    # Ensure that CA certificates are installed

    sudo apt-get -y install apt-transport-https ca-certificates

    # Add Docker repository key to APT keychain

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

    # Update where APT will search for Docker Packages

    echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu ${CODENAME} stable" |

    sudo tee /etc/apt/sources.list.d/docker.list

    # Update package lists

    sudo apt-get update

    # Verifies APT is pulling from the correct Repository

    sudo apt-cache policy docker-ce

    # Install kernel packages which allows us to use aufs storage driver if V14 (trusty/utopic)

    if [ "${CODENAME}" == "trusty" ]; then

    echo "# Installing required kernel packages"

    sudo apt-get -y install linux-image-extra-$(uname -r) linux-image-extra-virtual

    fi

    # Install Docker

    echo "# Installing Docker"

    sudo apt-get -y install docker-ce

    # Add user account to the docker group

    sudo usermod -aG docker $(whoami)

    # Install docker compose

    echo "# Installing Docker-Compose"

    sudo curl -L

    "https://github.com/docker/compose/releases/download/1.13.0/docker-compose-$(uname -s)-$(uname -m)"

    -o /usr/local/bin/docker-compose

    sudo chmod +x /usr/local/bin/docker-compose

    # Install python v2 if required

    set +e

    COUNT="$(python -V 2>&1 | grep -c 2.)"

    if [ ${COUNT} -ne 1 ]

    then

    sudo apt-get install -y python-minimal

    fi

    # Install unzip, required to install hyperledger fabric.

    sudo apt-get -y install unzip

    # Print installation details for user

    echo ''

    echo 'Installation completed, versions installed are:'

    echo ''

    echo -n 'Node: '

    node --version

    echo -n 'npm: '

    npm --version

    echo -n 'Docker: '

    docker --version

    echo -n 'Docker Compose: '

    docker-compose --version

    echo -n 'Python: '

    python -V

    # Print reminder of need to logout in order for these changes to take effect!

    echo ''

    echo "Please logout then login before continuing.”

    上述脚本执行完成后,退出并重新登录。执行下面的脚本,安装Composer(Composer会安装并启动Fabric网络)。

    #!/bin/bash

    #./install-composer.sh

    npm install -g composer-cli

    npm install -g composer-rest-server

    npm install -g generator-hyperledger-composer

    npm install -g yo

    npm install -g composer-playground

    mkdir ~/fabric-dev-servers && cd ~/fabric-dev-servers

    curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.tar.gz

    tar -xvf fabric-dev-servers.tar.gz

    cd ~/fabric-dev-servers

    ./downloadFabric.sh

    ./startFabric.sh

    ./createPeerAdminCard.sh

    此时执行docker ps可以看到Fabric网络运行的容器。

    二、创建业务网络、编写业务代码(chaincode)并打包

    1. 规划业务网络

    $ yo hyperledger-composer

    > Y

    > Business Network

    > test-bank

    > Basic Bank App

    > jack

    > jack@cloudtogo.cn

    > [ enter ]

    > test

    > No: generate a populated sample network

    $ cd ~/test-bank

    $ rm test/logic.js

    2. 编写业务代码,把的内容修改成models/test.cto的内容修改成

    namespace test

    asset Account identified by accountId {

    o String accountId

    --> Customer owner

    o Double balance

    }

    participant Customer identified by customerId {

    o String customerId

    o String firstName

    o String lastName

    }

    transaction AccountTransfer {

    --> Account from

    --> Account to

    o Double amount

    }

    把lib/logic.js的内容修改成:

    function accountTransfer(accountTransfer) {

    if (accountTransfer.from.balance < accountTransfer.amount) {

    throw new Error ("Insufficient funds");

    }

    accountTransfer.from.balance -= accountTransfer.amount;

    accountTransfer.to.balance += accountTransfer.amount;

    return getAssetRegistry('test.Account')

    .then (function (assetRegistry) {

    return assetRegistry.update(accountTransfer.from);

    })

    .then (function () {

    return getAssetRegistry('test.Account');

    })

    .then(function (assetRegistry) {

    return assetRegistry.update(accountTransfer.to);

    });

    }

    3. 更新ACL并打包成可部署的格式

    $ vim permissions.acl

    > :%s/SampleParticipant/Customer/g

    > :%s/SampleTransaction/AccountTransfer/g

    > :%s/SampleAsset/Account/g

    > :qw

    $ composer archive create -t dir -n .

    三、部署到Fabric网络

    $ composer network install --card PeerAdmin@hlfv1 --archiveFile test-bank@0.0.1.bna

    $ composer network start --networkName test-bank --networkVersion 0.0.1

       --card PeerAdmin@hlfv1 --networkAdmin admin --networkAdminEnrollSecret adminpw --file networkadmin.card

    $ composer card import --file networkadmin.card

    $ composer network ping --card admin@test-bank

    四、生成RESTful API

    $ composer-rest-server

    > admin@test-bank

    > always use namespaces

    > N

    > N

    > Y

    > N

    至此整个区块链银行转账系统部署完成,访问http://vmip:3000/explorer即可创建用户和账户以及发起转账操作。 本文在编写过程中参考了如下文章,在此对作者深表感谢。

    • https://www.hyperledger.org/projects/fabric

    • https://www.hyperledger.org/projects/composer

    • https://medium.freecodecamp.org/ultimate-end-to-end-tutorial-to-create-an-application-on-blockchain-using-hyperledger-3a83a80cbc71

    • https://medium.com/hyperlegendary/setting-up-a-blockchain-business-network-with-hyperledger-fabric-composer-running-in-multiple-bfbe4e38b6c6

    • https://medium.com/kokster/simpler-setup-for-hyperledger-fabric-on-kubernetes-using-docker-in-docker-8346f70fbe80

    • https://chainhero.io/2018/03/tutorial-build-blockchain-app-2/#install-instantiate-the-chaincode

  • 相关阅读:
    Android中Context具体解释 ---- 你所不知道的Context
    JDK6、Oracle11g、Weblogic10 For Linux64Bit安装部署说明
    matplotlib 可视化 —— 定制 matplotlib
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    指数函数的研究
    指数函数的研究
    指数分布的研究
  • 原文地址:https://www.cnblogs.com/cloudtogo/p/9252998.html
Copyright © 2011-2022 走看看