热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

五分钟搭建你的第一个区块链应用

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

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

 

 

言归正传。

 

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

 

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

 

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

 

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

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

 


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • 本文介绍了Hive常用命令及其用途,包括列出数据表、显示表字段信息、进入数据库、执行select操作、导出数据到csv文件等。同时还涉及了在AndroidManifest.xml中获取meta-data的value值的方法。 ... [详细]
author-avatar
dasda
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有