├── 00 cover.md ├── 01 preface.md ├── LICENSE.md ├── README.md ├── chapter1_00.md ├── chapter1_01 blockchain_core_concept.md ├── chapter1_02 types_ of_blockchains.md ├── chapter1_03 correct_method_of_learn_blockchain.md ├── chapter1_04 how_does_blockchain_work.md ├── chapter1_05 blockchain_application_principle.md ├── chapter1_06 blockchain_project_execution.md ├── chapter1_07 summary.md ├── chapter2_00.md ├── chapter2_01 misunderstands_of_blockchain.md ├── chapter2_02 the_ability_of_dev.md ├── chapter2_03 three_questions_of_dev.md ├── chapter2_04 blockchain_engineer_skills.md ├── chapter2_05 selection_of_technology.md ├── chapter2_06 summary.md ├── chapter3_00.md ├── chapter3_01 hyperledger_project_overview.md ├── chapter3_02_part1 hyperledger_fabric_network_prerequisites.md ├── chapter3_02_part2 hyperledger_fabric_network_installing.md ├── chapter3_02_part3 hyperledger_fabric_network_bring_up.md ├── chapter3_03 hyperledger_fabric_architecture.md ├── chapter3_04 hyperledger_fabric_core_components.md ├── chapter3_05 hyperledger_fabric_workflow_of_transaction.md ├── chapter3_06 summary.md ├── chapter4_00.md ├── chapter4_01 fabric_network_overview.md ├── chapter4_02 generate_certificate.md ├── chapter4_03 configuration_transaction.md ├── chapter4_04 bring_up_network.md ├── chapter4_05 create_join_channel.md ├── chapter4_06 test_fabric_network.md ├── chapter4_07_summary.md ├── chapter5_00.md ├── chapter5_01 smartcontract_dev_env.md ├── chapter5_02_part1 golang_core.md ├── chapter5_02_part2 golang_core.md ├── chapter5_02_part3 golang_core.md ├── chapter5_02_part4 golang_core.md ├── chapter5_03 chaincode_concept.md ├── chapter5_04 chaincode_dev.md ├── chapter5_05 chaincode_unit_test.md ├── chapter5_06 summary.md ├── chapter6_00.md ├── chapter6_01 solution.md ├── chapter6_02 requirement.md ├── chapter6_03 asset_business_design.md ├── chapter6_04 smartcontract_dev.md ├── chapter6_05 fabric_sdk.md ├── chapter6_06 blockchain_application_dev.md ├── chapter6_07 summary.md ├── chapter7_00.md ├── chapter7_01 ibm_bluemix_baas.md ├── chapter7_02 aliyun_baas.md ├── chapter7_03 cello.md ├── chapter7_04 summary.md ├── chapter8_00.md ├── chapter8_01 blockchain_technology_integration.md ├── chapter8_02 blockchain_technology_challenges.md ├── chapter8_03 blockchain_technology_trend.md ├── chapter8_04 summary.md ├── chapter9_00.md ├── pic ├── Hyperledger_fabirc_tuna_application.png ├── alipay.png ├── aliyun_mirrors.png ├── auto │ ├── image053.jpg │ ├── image054.jpg │ ├── image055.jpg │ ├── image056.jpg │ ├── image057.jpg │ ├── image058.jpg │ ├── image059.jpg │ ├── image060.jpg │ ├── image061.jpg │ ├── image062.jpg │ ├── image063.jpg │ ├── image064.jpg │ ├── image065.jpg │ ├── image066.jpg │ ├── image067.jpg │ ├── image068.jpg │ ├── image069.jpg │ ├── image070.jpg │ ├── image071.jpg │ ├── image072.jpg │ ├── image073.jpg │ ├── image074.jpg │ ├── image075.jpg │ ├── image076.jpg │ ├── image077.jpg │ ├── image078.jpg │ ├── image079.jpg │ ├── image080.jpg │ ├── image081.jpg │ ├── image082.jpg │ ├── image083.jpg │ ├── image084.jpg │ ├── image085.jpg │ ├── image086.jpg │ ├── image087.jpg │ ├── image088.jpg │ ├── image089.jpg │ ├── image090.jpg │ ├── image091.jpg │ ├── image092.jpg │ ├── image093.jpg │ ├── image094.jpg │ ├── image095.jpg │ ├── image096.jpg │ ├── image097.jpg │ ├── image098.jpg │ ├── image099.jpg │ ├── image100.jpg │ ├── image101.jpg │ ├── image102.jpg │ ├── image103.png │ ├── image104.jpg │ ├── image105.jpg │ ├── image106.jpg │ ├── image107.jpg │ ├── image108.jpg │ ├── image109.jpg │ ├── image110.jpg │ ├── image111.jpg │ ├── image112.jpg │ ├── image113.png │ ├── image114.png │ ├── image115.jpg │ ├── image116.png │ ├── image117.jpg │ ├── image118.jpg │ ├── image119.jpg │ ├── image120.jpg │ ├── image121.jpg │ ├── image122.jpg │ ├── image123.jpg │ ├── image124.jpg │ ├── image125.jpg │ ├── image126.jpg │ ├── image127.jpg │ ├── image128.jpg │ ├── image129.jpg │ ├── image130.jpg │ ├── image131.jpg │ ├── image132.png │ └── image133.jpg ├── bitcoin_paper.png ├── bitcoin_peers.png ├── bitcoin_transaction.png ├── blockchain_application_principle.png ├── book.jpg ├── book_and_project.png ├── bring_up.png ├── byfn_sh.png ├── configure_file.png ├── cover │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.jpg │ ├── 5.png │ ├── 6.png │ └── 7.png ├── distributed.png ├── docker_hello_world.png ├── fabric_architecture.png ├── fabric_ca_diagram.png ├── fabric_docker_images.png ├── fabric_network_setup.png ├── fabric_tools.png ├── fabric_workflow_of_transaction.png ├── hyperledger_cello.png ├── hyperledger_greenhouse.png ├── hyperledger_member.png ├── learn.png ├── make_tools.png ├── payment_code.png ├── project.jpg ├── public_key_infrastructure.png ├── qrcode.jpg ├── query_network.png ├── selection_of_technology.png └── types_of_blockchain.png └── src ├── fabric-material ├── basic-network │ ├── .env │ ├── README.md │ ├── config │ │ ├── channel.tx │ │ └── genesis.block │ ├── configtx.yaml │ ├── crypto-config.yaml │ ├── crypto-config │ │ ├── ordererOrganizations │ │ │ └── example.com │ │ │ │ ├── ca │ │ │ │ ├── a0606a4a860a1e31c90a23788da6f3b6b74925ed0d23061af4899409ba46ae6a_sk │ │ │ │ └── ca.example.com-cert.pem │ │ │ │ ├── msp │ │ │ │ ├── admincerts │ │ │ │ │ └── Admin@example.com-cert.pem │ │ │ │ ├── cacerts │ │ │ │ │ └── ca.example.com-cert.pem │ │ │ │ └── tlscacerts │ │ │ │ │ └── tlsca.example.com-cert.pem │ │ │ │ ├── orderers │ │ │ │ └── orderer.example.com │ │ │ │ │ ├── msp │ │ │ │ │ ├── admincerts │ │ │ │ │ │ └── Admin@example.com-cert.pem │ │ │ │ │ ├── cacerts │ │ │ │ │ │ └── ca.example.com-cert.pem │ │ │ │ │ ├── keystore │ │ │ │ │ │ └── 4d2f776c0fef8eac3f460a7c3558dc7859c4fe458e262e674a6c23f242ea33d1_sk │ │ │ │ │ ├── signcerts │ │ │ │ │ │ └── orderer.example.com-cert.pem │ │ │ │ │ └── tlscacerts │ │ │ │ │ │ └── tlsca.example.com-cert.pem │ │ │ │ │ └── tls │ │ │ │ │ ├── ca.crt │ │ │ │ │ ├── server.crt │ │ │ │ │ └── server.key │ │ │ │ ├── tlsca │ │ │ │ ├── 8d2186556c85d515e737d0c0da8d0d7672785b685cb503bcb95e53dcc279fba7_sk │ │ │ │ └── tlsca.example.com-cert.pem │ │ │ │ └── users │ │ │ │ └── Admin@example.com │ │ │ │ ├── msp │ │ │ │ ├── admincerts │ │ │ │ │ └── Admin@example.com-cert.pem │ │ │ │ ├── cacerts │ │ │ │ │ └── ca.example.com-cert.pem │ │ │ │ ├── keystore │ │ │ │ │ └── 1deeab5433fa6e5f045eb763109d6165268fba153211af1281f00d45f54b1022_sk │ │ │ │ ├── signcerts │ │ │ │ │ └── Admin@example.com-cert.pem │ │ │ │ └── tlscacerts │ │ │ │ │ └── tlsca.example.com-cert.pem │ │ │ │ └── tls │ │ │ │ ├── ca.crt │ │ │ │ ├── server.crt │ │ │ │ └── server.key │ │ └── peerOrganizations │ │ │ └── org1.example.com │ │ │ ├── ca │ │ │ ├── 4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_sk │ │ │ ├── ca.org1.example.com-cert.pem │ │ │ └── org1.example.com-cert.pem │ │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ └── tlscacerts │ │ │ │ └── tlsca.org1.example.com-cert.pem │ │ │ ├── peers │ │ │ └── peer0.org1.example.com │ │ │ │ ├── msp │ │ │ │ ├── admincerts │ │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ │ ├── cacerts │ │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ │ ├── keystore │ │ │ │ │ └── 46be1d569fe68f33e517c9e0072a0ccfbfb42727480fb8c8d0223af321a7893d_sk │ │ │ │ ├── signcerts │ │ │ │ │ └── peer0.org1.example.com-cert.pem │ │ │ │ └── tlscacerts │ │ │ │ │ └── tlsca.org1.example.com-cert.pem │ │ │ │ └── tls │ │ │ │ ├── ca.crt │ │ │ │ ├── server.crt │ │ │ │ └── server.key │ │ │ ├── tlsca │ │ │ ├── ed3fd82393e95fc2c475afc113c8d2c591f745d1babc4d6d9cce0a1acc168acb_sk │ │ │ └── tlsca.org1.example.com-cert.pem │ │ │ └── users │ │ │ ├── Admin@org1.example.com │ │ │ ├── msp │ │ │ │ ├── admincerts │ │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ │ ├── cacerts │ │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ │ ├── keystore │ │ │ │ │ └── cd96d5260ad4757551ed4a5a991e62130f8008a0bf996e4e4b84cd097a747fec_sk │ │ │ │ ├── signcerts │ │ │ │ │ └── Admin@org1.example.com-cert.pem │ │ │ │ └── tlscacerts │ │ │ │ │ └── tlsca.org1.example.com-cert.pem │ │ │ └── tls │ │ │ │ ├── ca.crt │ │ │ │ ├── server.crt │ │ │ │ └── server.key │ │ │ └── User1@org1.example.com │ │ │ ├── msp │ │ │ ├── admincerts │ │ │ │ └── User1@org1.example.com-cert.pem │ │ │ ├── cacerts │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ ├── keystore │ │ │ │ └── c75bd6911aca808941c3557ee7c97e90f3952e379497dc55eb903f31b50abc83_sk │ │ │ ├── signcerts │ │ │ │ └── User1@org1.example.com-cert.pem │ │ │ └── tlscacerts │ │ │ │ └── tlsca.org1.example.com-cert.pem │ │ │ └── tls │ │ │ ├── ca.crt │ │ │ ├── server.crt │ │ │ └── server.key │ ├── docker-compose.yml │ ├── generate.sh │ ├── init.sh │ ├── start.sh │ ├── stop.sh │ └── teardown.sh ├── chaincode │ ├── sample-chaincode.go │ └── tuna-app │ │ └── tuna-chaincode.go └── tuna-app │ ├── client │ ├── app.js │ ├── favicon.png │ └── index.html │ ├── controller.js │ ├── index.html │ ├── package-lock.json │ ├── package.json │ ├── registerAdmin.js │ ├── registerUser.js │ ├── routes.js │ ├── server.js │ ├── src │ ├── changeTunaHolder.js │ ├── queryAllTuna.js │ ├── queryTuna.js │ └── recordTuna.js │ └── startFabric.sh └── tuna-chaincode.go /00 cover.md: -------------------------------------------------------------------------------- 1 | # 企业级区块链实战教程 2 |
3 | 4 | 5 | ![企业级区块链实战教程](./pic/cover/7.png) 6 |
7 | 8 | ## 作者简介 9 | 10 | **张应平** 11 | 12 | * [纸贵科技](https://ziggurat.cn/)技术顾问 13 | * 曾任[陕西省数字证书认证中心](https://www.snca.com.cn/) 副总经理 14 | * 曾主导[电网企业综合实验平台](https://www.ixueshu.com/document/cd7838079876fcadc84d23b8ec161b67318947a18e7f9386.html)、一证通公共服务平台、电子政务统一平台等大型国家级项目 15 | * 从事信息化及密码产品技术研发16+年 16 | * 近5年主攻大数据、物联网、区块链领域,擅长系统设计、产品研发 17 | * 2019年参与国家电网区块链一系列方案的编写及国家电网[综合能源交易](https://www.sohu.com/a/364826594_505899)试点项目策划及实施,该项目作为国网第一个区块链项目目前已上线试运行。 18 | * 著有[《大话区块链》](https://item.jd.com/12719282.html)(2019年11月由清华大学出版社出版)《走进区块链》(网络版) 19 | * 公众号《应平与你说未来》 20 | 21 | 22 | -------------------------------------------------------------------------------- /01 preface.md: -------------------------------------------------------------------------------- 1 | # 序言 2 | 3 | 各位朋友们大家好,欢迎来到《企业级区块链实战教程》。 4 | 5 | 在大家开始正式学习这门课之前,我先简单介绍一下我的区块链从业之路。 6 | 7 | 我本人在IT行业也工作了16(+)年。在从事区块链之前,我在陕西省数字认证中心任副总经理,主管密码产品研发和项目实施,期间积累了一些密码应用的经验,对密码有一份特殊的感情。之前,我在国家电网工作过一段时间,也做过一段时间的电子政务,对企业信息化和政府信息化有一定的认知。 8 | 9 | 2016年下半年接触到了区块链。一开始主要关注的是公链项目,但公链的鱼龙混杂让我非常失望。2018年,在大家都沉醉于公链发币时,我毅然决然开始进军联盟链领域。 10 | 11 | 2019年年底,我负责的《基于区块链的双边交易》项目目正式上线,这个项目在国网发布的能源区块链十大应用场景中排名第二。 另外,我的新书[《大话区块链》](https://item.jd.com/12719282.html)在2019年十一长假结束后正式上线京东,上线京东一个月后,首印3000册就卖光了。当然这主要是运气比较好——上线后两周正好赶上了中共中央政治局集体学习区块链。 12 | 13 | 我学习区块链是从比特币开始的。之前很长一段时间我对于比特币认识和大部分人一样,觉着它就像QQ币一样,只是极客们的玩具而已。2016年下半年,机缘巧合我听到了前谷歌科学家吴军老师讲解比特币,觉着这个东西值得好好学习一下。然后我就花了很长时间学习《精通比特币》这本书。 14 | 15 | 看第一遍的时候,其实我并没有看懂,甚至怀疑我这么多年的技术是白搞了,后来咬着牙看了三遍,终于在某天晚上彻底看懂了比特币的实现原理。之后被比特币背后的技术所深深吸引,从此我就成为了区块链技术的重度拥护者。 16 | 17 | 区块链技术吸引我的原因主要有两个方面:一方面是它竟然可以将密码算法应用的如此巧妙;另一面是它竟然可以将分布式与经济学结合的如此完美。 18 | 19 | 之后三年时间里,我相继学习了以太坊、EOS、Fabric,也自学了经济学相关的知识,对于区块链的认识逐渐有了自己的一些看法。即使在熊市里我也一直坚持学习区块链,而且一天都未中断,这才有了[《大话区块链》](https://item.jd.com/12719282.html)、《企业级区块链实战教程》等书籍和实施的区块链项目。 20 | 21 | 区块链技术经过十年的发展,已经从数字货币开始延伸到数字金融、物联网、智能制造、供应链管理、数字资产交易等多个领域。2019年被看做是区块链商业应用的元年,2020年政府、企业将会大规模进军区块链行业,相对公链,联盟链在我国具有得天独厚的发展优势。 22 | 23 | 相信大家已经通过各种渠道了解到了区块链这项技术,但如何将区块链技术应用在政府、企业实际业务中,大部分人估计还是一头雾水。 24 | 25 | 2020年本来打算将主要精力放在项目落地上,但突然其来的疫情使得整个社会都按下了暂停键,说好的项目也就暂时搁置。一开始被疫情搞的极度恐慌,根本无法静下心来写文字。后来通过看书、锻炼身体整个人逐渐平静下来。经过一个多月的努力,才有了大家现在看到的《企业级区块链实战课程》。 26 | 27 | 这门实战课是目前市面上为数不多的实战课,是我在区块链行业三年沉淀的结果。课涵盖了我对区块链的认知以及项目实战经验,希望通过这门课程让大家能够掌握区块链技术的精华,投入到区块链技术的浪潮中来。 28 | 29 | 《企业级区块链实战教程》是基于[《大话区块链》](https://item.jd.com/12719282.html)这本书以及我之前在国家电网的项目实施经验,可以负责任的说这是目前市面最具实战精神的课程。 30 | 31 | 现在我们这门课程开源在[Github](https://github.com/yingpingzhang/enterprise_blockchain_tutorial)上,供大家免费学习。希望这个教程能够帮助大家扫清区块链从业路上的障碍,也希望大家多多提意见,一起学习,一起进步。 32 | 33 | 张应平 34 | 2020年3月于西安 35 | 36 | -------------------------------------------------------------------------------- /chapter1_00.md: -------------------------------------------------------------------------------- 1 | # 第一章 区块链技术理论 2 | 3 | 本章主要内容: 4 | 5 | * [区块链核心概念](./chapter1_01%20blockchain_core_concept.md) 6 | * [区块链的分类](./chapter1_02%20types_%20of_blockchains.md) 7 | * [学习区块链的正确姿势](./chapter1_03%20correct_method_of_learn_blockchain.md) 8 | * [区块链技术原理](./chapter1_04%20how_does_blockchain_work.md) 9 | * [区块链的应用原则](./chapter1_05%20blockchain%20application%20principle.md) 10 | * [区块链实施原则](./chapter1_06%20blockchain_project_execution.md) 11 | * [区块链技术理论总结](./chapter1_07%20summary.md) 12 | 13 | 注意:这个章节是对[《大话区块链》](https://item.jd.com/12719282.html)一书中**第一篇区块链技术指南**的高度概括,如果学习过程中有困难,建议停下来,先阅读原书。 -------------------------------------------------------------------------------- /chapter1_01 blockchain_core_concept.md: -------------------------------------------------------------------------------- 1 | ## 区块链核心概念 2 | 3 | 我经常会被人问到这样一句话,张老师您能不用一句话给我解释一下什么是区块链? 4 | 5 | 我想来想去如果只讲一句话,那就是**区块链是一种分布式账本技术**。这个账本与我们之前使用的账本不一样,由于它是一群人来记账,所以修改这个账本的难度就比较高。 6 | 7 |
8 | 9 | 10 | ![大话区块链](./pic/distributed.png "分布式记账") 11 | 12 | 1-01 分布式记账 13 |
14 | 15 | 整个人类文明发展都是伴随着记账技术的不断演化,经历了从原始的单式记账、复式记账、现在的数字化记账到以区块链为代表的分布式记账。 16 | 17 | 传统的中心化数字记账都依赖于某一个组织(比如阿里)的可信度,以及这个组织背后的技术是否过硬,管理是否足够严格,等等。 18 | 19 | 而区块链则不同,它是通过共识机制发动节点来共同记账,在区块链技术中,要修改数据一般要得到半数左右节点的同意才可以修改(不同共识机制的策略会有所不同)。相对于传统中心化单个节点说了算的记账技术,采用区块链记账可以提高大家的信任程度,而这种信任机制的建立不依赖于某个组织、某个人,是由区块链技术来保障的。 20 | 21 | 区块链确定性是由密码学保障的,密码学是由数学保障的,而数学是这个宇宙唯一确定的学科。如果这个世界上外星文明,唯一可以让人类与外星文明进行沟通的就是数学。在地球上1+1=2,在其他星球上1+1也只能等于2。区块链技术的确定性是由数学来保障的。 22 | 23 | 区块链记账具有去中心化、难以篡改、可追溯等特点。 24 | 25 | 去中心化的英文是decentralized,原意是: 26 | >* transfer (authority) from central to local government. 27 | >* move departments of (a large organization) away from a single administrative centre to other locations. 28 | 29 | 根据英文原意,将去中心化理解为多中心化更为合适。 30 | 31 | 难以篡改是区块链的主要特性。传统数据库包含了增删改查(CURD),而区块链只有增加和查询,不能修改、不能删除。因此,区块链也是一种“历史记录不可篡改的数据库”。相对传统中心化系统,区块链是一种确定性系统。 32 | 33 | 可追溯性是基于数据结构和时间戳来保证的。 34 | 35 | 具体技术细节我会在技术原理部分进一步阐述,或者在京东上购买我的新书[《大话区块链》](https://item.jd.com/12719282.html),第一章节和第三章节都有详细的介绍。 36 | -------------------------------------------------------------------------------- /chapter1_02 types_ of_blockchains.md: -------------------------------------------------------------------------------- 1 | ## 区块链的分类 2 | 3 | 区块链分为公有链、联盟链、私有链三种。 4 | 5 | 相对来说,越靠近公有链,对节点的认证和权限管理要求越少,去中心化程度越高。越靠近私有链,对节点的认证和授权管理程度越高,中心化程度越高。 6 | 7 |
8 | 9 | 10 | ![大话区块链](./pic/types_of_blockchain.png "区块链的分类") 11 | 12 | 1-02 区块链的分类 13 |
14 | 15 | **公有链**是最具区块链精神的。在公有链上,任何人都可以作为区块链的节点,节点通常具有匿名性,一般会通过发币鼓励参与者记账。 16 | 17 | 公有链主流的共识机制有工作量证明机制(Proof of Work,PoW)、权益证明机制(Proof of Stake,PoS)和代理权益证明机制(Delegate Proof of Stake,DPoS)。这些共识机制往往都融合了经济学———工作量证明机制锚定的是算力,权益证明机制和代理权益证明机制锚定的是权益(token)。 18 | 19 | 共识机制的核心是记账权的争夺,公有链的设计思路是让恶意节点的攻击成本远远大于诚实节点的受益,基于利益的考虑,大家与其作恶白白损失金钱还不如老老实实记账。 20 | 21 | 典型公有链有比特币、以太坊、EOS等,都是在特定时期解决了不同的问题。比特币是世界上第一个成功的去中心化数字货币系统;以太坊在比特币基础上提出了一种可编程、可运算的智能合约公有链;EOS提出了超越货币、经济的去中心化应用操作系统。 22 | 23 | 相对公有链的开放性,**联盟链**节点需要经过认证才能参与到区块链网络中。由于联盟链节点数有限,因此联盟链的交易速度更快,具有更高的扩展性,并能很好的保护交易隐私。 24 | 25 | 公有链在共识机制的选择上一般都会采用拜占庭容错机制,拜占庭机制解决了节点故障和节点作恶(伪造数据)情况下,系统都能够达成共识。由于联盟链节点数有限且需要认证,为了提高效率,因此大部分联盟链在共识机制上弱化了节点作恶,重点考虑系统1/3节点故障下系统共识机制的达成。 26 | 27 | 联盟链主要应用在政府、企业级应用中,一般不需要代币作为激励机制。比如政府部门之间和企业之间的业务,通过区块链技术为各部门之间建立一个共享账本,可以大幅度提升部门之间的工作效率。在这种情况下,每个部门作为记账节点出现,其实激励已经演变成为跨部门之间业务协同给大家带来的经济效益。 28 | 29 | 2019年10月24日中共中央政治局集体学习区块链之后,国家开始大力鼓励发展区块链技术。相对于公链,联盟链在我国具有得天独厚的发展优势。 30 | 31 | 联盟链的代表是超级账本( Hyperledger )。超级账本( Hyperledger )项目是首个面向企业应用场景的开源分布式账本平台,由Linux基金会主管,领导者囊括了金融、银行、物联网、供应链、制造行业和技术领域的佼佼者,目前成员已增长到275+多个,国际上有我们熟悉的埃森哲、IBM、英特尔、摩根大通、花旗集团、德国电信、微软等巨头,国内熟悉的有蚂蚁金服、百度、小米、招商银行、趣链科技、联想、纸贵科技等区块链企业。 32 | 33 | Hyperledger Fabric是目前超级账本项目中发展最好的子项目,作为最早加入超级账本项目的顶级项目,Fabric 由IBM 、DAH 等企业于2015年底提交到社区。该项目的定位是面向企业的分布式账本平台,创新地引入了权限管理机制,设计上支持可插拔、可扩展,是首个面向联盟链场景的开源项目。作为联盟链最重要的代表,Hyperledger Fabric具有良好的设计架构、完善的文档、清晰的代码,是企业研发和实施区块链的首选。 34 | 35 | **私有链**是在某一领域、某一企业运行的区块链。相对公有链、联盟链,私有链相对比较封闭。在一个组织机构比较复杂的企业里,将各个部门作为节点出现,可以解决部门间的信任问题。 36 | 37 | 从区块链信任的特点来看,区块链会在公有链和联盟链得到长足发展。从长远来看,公有链和联盟链在技术上会趋向融合,界限也会越来越模糊。一般是将需要信任的数据放在公有链上,而一些行业数据、私有数据放在联盟链上。 38 | -------------------------------------------------------------------------------- /chapter1_03 correct_method_of_learn_blockchain.md: -------------------------------------------------------------------------------- 1 | ## 学习区块链的正确姿势 2 | 3 | 在学习区块链原理之前,我们先看一下学习区块链的正确姿势。下面这些建议是老司机给大家进入区块链世界的一把钥匙。 4 | 5 | >1. 比特币遵循了奥卡姆剃刀(Occam‘s razor)原理的简约法则,可作为理解区块链实现原理的入门课。 6 | >2. 以太坊生态相对比较完善,可将以太坊作为区块链开发者的入门课程。 7 | >3. Fabric良好的设计架构、完善的文档、清晰的代码,可以将Fabric作为研发企业级商用区块链平台的基础平台。 8 | 9 | 由于比特币遵循了奥卡姆剃刀原理,“如无必要,勿增实体”,因此比特币可以作为理解区块链实现原理的入门课。搞懂了交易、区块、共识机制、P2P这些技术,我们再学习以太坊、EOS、Fabric等区块链技术的时候就会方便很多。 10 | 11 | 由于以太坊有完善的开发生态,社区提供了大量的开发工具、API,因此可以将以太坊作为区块链开发的入门课程。如果大家愿意花上一个星期时间,用以太坊搭建一个区块链应用,相信你对区块链的认知会比只了解概念的人瞬间会高出一个level。 12 | 13 | Fabric是超级账本下面的一个子项目,它是一个开源项目,由于有良好的设计架构、完善的文档、可插拔的代码结构,任何人只要都可以根据实际业务需要非常方便的修改共识机制、密码算法。所以如果要研发企业级商用区块链平台,Fabric是大家的首选。业内很多知名的区块链企业(蚂蚁区块链、趣链科技、纸贵科技、国家电网等)都是基于Fabric研发自己的联盟链平台。 14 | 15 | 我在[《大话区块链》](https://item.jd.com/12719282.html)第三章节详细介绍了学习区块链的正确姿势,有兴趣的朋友可以去京东上购买书籍学习。 16 | 17 | -------------------------------------------------------------------------------- /chapter1_04 how_does_blockchain_work.md: -------------------------------------------------------------------------------- 1 | ## 区块链技术原理 2 | 3 | 在[学习区块链的正确姿势](./chapter1_03%20correct_method_of_learn_blockchain.md)章节我们知道了学习区块链的正确姿势,这个章节我们用前面介绍的姿势概览下区块链的技术原理。 4 | 5 | >* 通过比特币转账,我们可以理解区块链的基本原理; 6 | >* 通过以太坊我们可以初步理解智能合约; 7 | >* 通过Hyperledger Fabric我们可以将区块链技术应用到企业应用中。 8 | 9 | ### 比特币转账 10 | 11 | 比特币实际上是一个货币系统,要了解区块链的技术原理,最好的方式是从比特币转账机制开始。 12 | 13 | 举个例子,我——张应平要给乔帮主转账0.1个比特币购买个苹果手机。 14 | 15 | 这个过程分为两个阶段,第一个阶段是通过钱包转账,第二阶段是矿工使用矿机进行记账。 16 | 17 | 我们先看怎样通过钱包转账。钱包转账分为三个步骤: 18 | 19 | * 第一步,钱包将0.1个比特币,也就是我们常说交易,和乔帮主的公钥做一个哈希运算。 20 | 21 | * 第二步,钱包使用张应平的私钥对上面的哈希进行签名。 22 | 23 | * 第三步,将签名、我的公钥附在0.1个比特币后面广播给乔帮主。 24 |
25 | 26 | 27 | ![大话区块链](./pic/bitcoin_transaction.png "分布式记账") 28 | 29 | 1-04-01 比特币转账 30 |
31 | 32 | 对照上边的图,大家就可以明白比特币转账的原理了,其实比特币钱包就只做了这么个事情,这三步都与密码息息相关,这也是为什么说密码学是区块链的基石。 33 | 34 | 在上面的转账过程中,张应平给乔帮主转0.1个比特币的过程中,为了确保0.1个比特币不会被其他人修改成0.2、0.3个比特币,所以这里使用了哈希算法对0.1个比特币和公钥做了一次哈希运算。 35 | 36 | 要验证我是否真的是给乔帮主转了0.1个比特币,只需要使用我的公钥对签名进行解密,得到原始哈希值,然后再使用哈希算法对我给乔帮主0.1个比特币再做一次哈希运算,最后将两次哈希运算结果进行比对,就可以验证0.1个比特币是否被篡改,以及是否是张应平发送的比特币了。 37 | 38 | 从上面的讲解我们可以看出,密码学在区块链的中价值。使用哈希算法,可以保证数据的不可篡改性,使用私钥进行数字签名,可以保证身份的唯一性。 39 | 40 | 当然密码的用途不只限于此,防止双重支付(双花、重放攻击)、保证数据隐私都与密码算法息息相关。总之,区块链与密码学的血缘关系非常紧密,因此才有人怀疑比特币的发明极有可能是一群密码领域造诣极深的专家。 41 | 42 | *** 43 | 44 | 密码学相关知识已经汗牛充栋,这里不再赘述,重点讲解一下**双重支付**。 45 | 46 | 2008年11月1日,一个化名为中本聪(Satoshi Nakamoto)的密码极客发布了比特币白皮书(《比特币:一种点对点的电子现金系统》)。中本聪在比特币白皮书里用大量的篇幅描述怎样防止双重支付。这也是区块链技术为什么区块链被称为价值互联网的原因。 47 | 48 |
49 | 50 | 51 | ![大话区块链](./pic/bitcoin_paper.png "比特币白皮书") 52 | 53 | 1-04-02 比特币白皮书 54 |
55 | 什么叫双重支付? 56 | 57 | 举个例子,互联网可以让信息几乎零成本的传输,比如现在知识付费时代很多的大的IP,即使一个课程的价格非常低,但是由于课程可以被十几万或者几十万用户阅读,因此收益也会非常高。 58 | 59 | 但价值传递与信息传递却恰恰相反,我的一元钱给了老王就不能给小王。生活中如果我们用实物交割很容易解决双重支付的问题,比如说纸币,我将一元钱纸币给了老王就不能给小王,但价值一旦数字化,由于信息很容易被复制,同一笔数字资产就可能会被重复使用。 60 | 61 | 在比特币系统中,每笔交易都会加盖时间戳,所有交易都会按照时间顺序存储在链状的数据结构里,由于每笔交易都有一个唯一可信的时间戳,即使一笔交易被重复花费,但系统只认最早的那一笔交易,这样就可以有效防止一笔交易被同时花费,也就解决了价值传递的唯一性问题。 62 | 63 | 讲到这里,很多人肯定这样一个疑问,为什么支付宝、微信可以做到价值传递?这里需要说明的是支付宝、微信有一个中心化的权威机构来解决双重支付的问题。 64 | 65 | 比如说张三通过支付宝给李四转了100元,支付宝这时候会先销毁张三的100元,然后再发行新的100元支付给李四。整个支付过程只有支付宝发行的新币有效,这样就可以有效解决双重支付的问题。 66 | 67 | 但比特币是一个去中心化的系统,没有支付宝这样的中心化机构,所以他就需要采用可信时间戳来解决双重支付的问题。 68 | 69 | 双重支付是比特币白皮书里重点讲述的内容,理解了双重支付,也就容易理解为什么说区块链是价值互联网。 70 | 71 | *** 72 | 73 | 前面我们在讲我给乔帮主转0.1个比特币的时候,计算哈希、签名、发送这些动作其实是在钱包里完成的。钱包只是比特币中一种特殊的节点,它本身并不存储数据,真正存储数据的是全节点,也就是我们说的挖矿节点。 74 | 75 | 一旦我们在钱包里点击发送比特币,这时候就需要挖矿节点来干活了。挖矿节点会做以下四件事情,而这四步又与**共识机制**息息相关: 76 | 77 | * 第一步,每个挖矿节点依据一个校验列表对每个交易进行独立验证。 78 | * 第二步,通过完成工作量证明算法的计算,挖矿节点将交易记录独立打包进新区块。 79 | * 第三步,每个挖矿节点独立对新区块进行校验并将区块组装进区块链。 80 | * 第四步,每个节点对区块链进行独立选择,在工作量证明机制下选择累计工作量最大的区块链。 81 | 82 | 83 | 第一步就是挖矿节点通过一个校验列表进行交易验证,这个步骤其中就包含我们刚才说的验证签名、核对哈希是否一致。 84 | 85 | 第二步、第三步、第三步都需要**工作量证明机制**参与。 86 | 87 | 挖矿节点首先将交易打包到区块,也就是将我们刚才那笔转账记录打包到区块中(当然区块里一般会有大概1000笔左右的记录),接着挖矿成功的节点会将当前区块链接到区块链上; 88 | 89 | 需要注意的是由于比特币节点分布在全球,这时候很容易出现分叉的情况。这点如同我们去火车站买票排队一样,有时候会出现几个不同队伍,这时候大家会选择最长的那个队伍。为了保证全网数据的一致性,这时候我们会选择全网工作量累计最大的那条链。 90 | 91 | 通过密码学和共识机制两条主线大家就可以看懂区块链的基本原理了。如果对密码学、共识机制、交易、区块、区块链、P2P网络等概念还不清楚,大家可以学习[《大话区块链》](https://item.jd.com/12719282.html)相关章节。 92 | 93 | ### 以太坊复活智能合约 94 | 95 | 区块链除了发币,最大的创新就是智能合约,现在区块链能用于很多领域这个要归功于智能合约。区块链里面的密码学、分布式、共识机制、P2P都是大家已经非常熟悉的技术,而智能合约则是区块链独有的发明。 96 | 97 | #### 智能合约 98 | 99 | 智能合约(Smart Contract)是在90年代由尼克·萨博(Nick Szabo)提出的理念,由于缺少可信的执行环境一直没有被应用到实际产业中。区块链技术的出现给智能合约带来了新的契机。 100 | 101 | 由于区块链是一个历史记录不可篡改的数据库,因此将计算机代码写在链上就可以让代码具备“智能”的特点,有点类似自动售货机。智能合约本质上就是一段运行在区块链上的代码,这段代码具备去中心化、公开透明、不可篡改等特点。 102 | 103 | 现实生活中,甲乙双方要进行一笔交易,我们需要签订一个合同,在合同中约定合同标的、内容、权利、义务等合同法规定的条款,双方盖章签字,一式两份。以买卖合同为例,一旦双方签订一份了合同,后续就要按照合同执行。但现实中由于大家的法律观念意识不强,经常会出现违约事件,尤其是在国内这种事情大家已经见怪不怪了。即使签订了合同也不会按照合同执行,这时候合同就变成了一张废纸,对双方都没有约束力。一旦出现纠纷,只能诉诸法律,由法院来强制执行。 104 | 105 | 那么有没有一种更有效的办法来确保合同的执行,答案是将上面的合同内容写在智能合约里,一旦智能合约中某个条件达成,合约就会自动执行。由于区块链信任的特点,使得合约的执行不依赖于人和现有中心化机构,这样就可以有效解决合同中出现的纠纷。 106 | 107 | #### 以太坊的虚拟机 108 | 109 | 在比特币网络上我们只能进行转账,以太坊网络上不但可以转账,还可以运行智能合约。 110 | 111 | 以太坊虚拟机(EVM)是以太坊智能合约的运行环境。它不仅被沙箱封装起来,事实上它已经被完全隔离,也就是说运行在EVM内部的代码不能接触到网络、文件系统或者其它进程,甚至智能合约之间也只能有限地调用。 112 | 113 | EVM的主要功能是将高级开发语言编写的智能合约编译成以太坊可以识别的字节码。一旦完成智能合约的编写,我们就需要将智能合约编译成字节码,部署到区块链上。 114 | 115 | 调用智能合约实际上就是向智能合约地址发起一笔交易,该交易不仅包含以太币,而且还包含数据。部署智能合约其实就是将一段代码运行在以太坊网络节点的以太坊虚拟机上。 116 | 117 | 由于代码运行在每个以太坊节点的虚拟机上,每个节点都在进行并行计算,这就牺牲了程序的效率,但同时可保证代码足够安全。另一方面智能合约适合于运行一些确定性的业务逻辑,如果运行一些随机性较强的业务,就需要对业务进行特殊处理,确保每个节点每次运行结果的一致性。 118 | 119 | ### Hyperledger Fabric企业应用先锋 120 | 121 | 超级账本引入权限控制机制将区块链带入到跨企业应用场景中,使得区块链技术不再局限于完全开放的公有链模式,分布式账本技术(Distributed Ledger Technologies,DLT)正在被主流企业认可并采用。(第三章节详细介绍) 122 | -------------------------------------------------------------------------------- /chapter1_05 blockchain_application_principle.md: -------------------------------------------------------------------------------- 1 | ## 区块链应用原则 2 | 3 | 理解了区块链的技术原理,下面我们看看区块链技术是怎样应用到金融、数据共享、商品溯源、数据资产化等领域。 4 | 5 | 我在[《大话区块链》](https://item.jd.com/12719282.html)一书中对区块链应用给出了如下应用原则: 6 | 7 |
8 | 9 | 10 | ![大话区块链](./pic/blockchain_application_principle.png "分布式记账") 11 | 12 | 1-05 区块链应用原则 13 |
14 | 15 | 下面来简要的解释一下: 16 | 17 | ### 数据即效益 18 | 19 | 区块链第一个作用是可以在保证数据所有权的情况下实现数据共享。 20 | 21 | 由于区块链技术可以保证数据所有权,因此可以将区块链应用在存证、数字版权、数据共享和数据资产化等应用场景。 22 | 23 | 存证和数据共享是区块链现阶段可以落地的应用场景,数据资产化将会是区块链技术未来一个大的发展趋势。 24 | 25 | ### 以信任为生 26 | 27 | 区块链第二个作用是可以实现跨机构、跨组织、跨部门协作。 28 | 29 | 金融机构做的就是信任中介的生意,比特币就是为了建立一个全球银行而生,金融行业是最早研究区块链的机构。 30 | 31 | 区块链在金融行业应用该可以分为两个方向,第一个是金融业务协作平台,比如供应链金融、资产证券化(ABS)、保险理赔等,区块链主要作用是解决多方协作的效率低、成本高、信息透明度低、监管不透明等问题;第二方向是金融基础设施,主要集中在支付和数字货币,但这个领域是一个非常复杂的系统工程,需要自上而下逐步推进。 32 | 33 | 除了金融,供应链管理、智能制造、医疗、商品溯源、精准扶贫这些领域都是区块链技术比较好的应用场景。 34 | 35 | 另外,我认为公共行业(投票、选举、公益、社交等公共活动)将是区块链的一个主战场。 36 | 37 | 为什么这么讲?原因是公共行业缺乏成熟的商业模式,政府和企业都非常无助,区块链可以用较低的成本将社会成员组织起来,让公共行业变得更加高效、可持续。 38 | 39 | 以今年爆发的疫情为例。新型冠状病毒疫情爆发之后,武汉及周边各市县均爆出物资供给不足的情况。重大公共卫生事件在公共社会事件中属于较复杂的类型,统筹安排难度大,周期长,各供需方对接效率低下,而目前信息采集与公布平台不一致,信息散乱很难进行有效沟通。如果我们采用区块链搭建一个公共卫生平台,让供需方进行分布式对接则可以大幅度提升效率。 40 | 41 | ### 新兴业务 42 | 43 | 互联网和企业信息化近10年的快速发展,得益于云计算这种中心化技术的成熟,但中心化架构除了自身的缺陷之外,在面对一些新业务明显能力不足。当中心化业务走到尽头,许多新兴业务在不远的将来将会成为社会的主流。 44 | 45 | 不管是数据共享,还是信任重构都是使用区块链解决现有业务痛点,属于降维打击——是使用区块链技术解决传统业务的痛点。 46 | 47 | 但类似物联网、分布式能源等业务都属于新兴业务,传统中心化架构根本无法应对。如何将区块链技术应用在这些业务场景中是区块链技术未来的发展趋势,但受制于业务和技术的不成熟这些领域的到来还需时间。 -------------------------------------------------------------------------------- /chapter1_06 blockchain_project_execution.md: -------------------------------------------------------------------------------- 1 | ## 区块链实施原则 2 | 3 | 在项目实施时,我们需要根据实际业务来评估区块链技术能够做什么。评估业务中有多少参与者?参加者的地域分布如何?你有什么性能要求?如果考虑将数据库迁移到区块链时,需要重点定义区块链系统中每一方的规则、风险和责任。以下是适合区块链技术解决的业务,具体原则如下: 4 | 5 | 1) 需要建立一个共享的数据库,且数据库中有多方参与者。 6 | 7 | 2) 由于各种原因,参与业务的各方之间没有建立起信任关系。 8 | 9 | 3) 在现有业务中必须信任一个或多个信任机构,比如托管机构、发证机构、数据提供者等。 10 | 11 | 4) 在现有业务中有加密认证的业务需求,以保证数据的机密性、完整性、身份的唯一性和不可抵赖。 12 | 13 | 5) 在业务流程中,数据需要集成到不同的数据库中,而且之间数据需要保证一致,且业务数字化的需求很迫切。 14 | 15 | 6) 对于系统参与者有统一的规则。 16 | 17 | 7) 双方的决策是透明的,而不是保密的。 18 | 19 | 8) 需要有客观的、不可改变的历史或事实记录供各方参考。 20 | 21 | 区块链技术虽然很强大,但区块链也不是万能的,以下情况不适合区块链技术来解决,具体原则如下: 22 | 23 | 1) 业务数据无法公开。 24 | 25 | 区块链技术最大的优势数据公开、透明。如果涉及**过多**隐私数据,目前的区块链技术还不能满足业务需要。 26 | 27 | 2) 业务中涉及大量的静态数据,或者数据非常大。 28 | 29 | 由于区块链技术是将数据存储在不同节点上,这样导致系统的数据量会非常大且效率不高。最好的解决方案是将业务状态数据和必要的数据信息存储在区块链上,如果是静态数据、或者数据量非常大,建议采用其他技术解决方案会更合适(IPFS是备选方案)。 30 | 31 | 3) 业务规则经常变化。 32 | 33 | 如果业务规则经常变动,或者业务规则不确定,这样的业务场景是不适合区块链技术来解决的。在区块链中,智能合约的业务规则是预先设定的,一旦部署,业务规则将不能改动,因此智能合约业务必须是确定的业务规则。另外,由于区块链数据不可篡改,只能增加、不能删除、修改,因此,对于经常变动的业务采用传统关系型数据库会更适合(联盟链合约是可以升级)。 34 | 35 | 4) 需要使用外部服务来收集、存储数据。 36 | 37 | 为了确保智能合约的安全性,不受来自外部的攻击,因此智能合约在设计上是不能获取外部数据,只能与区块链上的数据进行交互。智能合约要与外部数据进行交互,就必须将外部数据存储在链上,这样智能合约就可以安全的使用区块链上的数据了。 38 | 39 | 在区块链实践中,我们要将区块链公开、透明、不可篡改、可追溯的特点应用在关键业务中,对于大部分应用和业务,一些变通的方法就可以满足业务的需求。 40 | 41 | 比如对于一般文件的存储,可以使用关系型数据主、从结构来保证数据的安全性。类似的,我们可以使用区块链中的加密算法来对数据进行加密,无需采用区块链技术中的数据复制机制。 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /chapter1_07 summary.md: -------------------------------------------------------------------------------- 1 | ## 区块链技术理论总结 2 | 3 | 通过本章的学习,我们理解了区块链基本概念,技术原理,并对区块链应用和实施有了初步了认识。 4 | 5 | 下一章区块链开发实战预备知识章节,我们再对区块链开发做必要知识储备。 6 | 7 | 祝大家学习快乐! 8 | 9 | -------------------------------------------------------------------------------- /chapter2_00.md: -------------------------------------------------------------------------------- 1 | # 第二章 区块链开发实战预备知识 2 | 3 | 本章主要内容: 4 | 5 | * [区块链很难学吗?](./chapter2_01%20misunderstands_of_blockchain.md) 6 | * [区块链开发应该具备的能力](./chapter2_02%20the_ability_of_dev.md) 7 | * [区块链编程需要注意的问题](./chapter2_03%20three_questions_of_dev.md) 8 | * [区块链开发工程师岗位技能要求](./chapter2_04%20blockchain_engineer_skills.md) 9 | * [区块技术选型](./chapter2_05%20selection_of_technology.md) 10 | * [区块链开发实战预备知识总结](./chapter2_06%20summary.md) 11 | 12 | 注意:这个章节是对[《大话区块链》](https://item.jd.com/12719282.html)一书中第二篇**区块链工程师基本能力**的高度概括,如果学习过程中有困难,建议停下来,先阅读原书。 -------------------------------------------------------------------------------- /chapter2_01 misunderstands_of_blockchain.md: -------------------------------------------------------------------------------- 1 | ## 区块链很难学吗? 2 | 3 | 大家常见误区主要有两个: 4 | 5 | **第一个误区:将智能合约开发与区块链底层协议开发混为一谈。** 6 | 7 | 大部分人认为的区块链开发其实是智能合约开发,也就是基于某一个链(比如以太坊、超级账本Fabric等)进行智能合约开发,而不是区块链底层协议开发。 8 | 9 | 区块链底层协议开发门槛很高,需要有丰富的密码学、分布式等技术开发经验才可以胜任。但智能合约开发其实就是基于区块链底层协议提供的高级语言进行编程,目前常用的有以太坊的solidity、EOS的C++、Fabric的go语言。 10 | 11 | **第二个误区:将技术研究和工具使用混为一谈。** 12 | 13 | 如果我们的目标是要去谷歌、微软这样的大公司从事研发工作,那就需要具备深厚的计算机素养,熟悉计算机原理、算法等知识。但如果我们的目标是网站、APP、微信小程序、网络爬虫等应用的开发,那么只需要学习一点儿高级语言即可。 14 | 15 | 比如APP开发就需要学习Android或者IOS的开发,网站开发就需要具备一些Html、JavaScript知识,人工智能就需要学习Python。 16 | 17 | 同样学习区块链智能合约开发,在以太坊上我们需要掌握solidity(类似于JavaScript),在Fabric上需要掌握go语言、Node.js、Java其中一门开发语言,EOS需要掌握C++。 18 | 19 | 从工程角度来看,软件开发更看重的是业务需求、系统设计能力。一个高级工程师和一个初级工程师水平的差异在于两者的需求理解能力和软件设计水平的差异。如果只从编码角度来看,工程师就像生产线的工人,只不过大家使用的工具不同罢了。程序员需要熟悉计算机的基本操作,熟悉一些工程师必备的工具就可以开始干活了。 20 | 21 | **在实际工程中,那些熟悉业务的人员,一旦掌握了开发工具,软件开发能力反而会超过一名纯粹只懂技术的人员**。 22 | -------------------------------------------------------------------------------- /chapter2_02 the_ability_of_dev.md: -------------------------------------------------------------------------------- 1 | ## 区块链开发应该具备的能力 2 | 3 | 那么要踏进区块链世界成为区块链世界里的弄潮儿,从事区块链开发到底需要具备什么样的能力?经过梳理和思考,我认为从事区块链开发需要具备以下三种能力。 4 | 5 | 1. 能够正确理解区块链。了解区块链技术的基本概念,熟悉密码学、分布式、共识机制、P2P网络等技术,熟悉比特币、以太坊、超级账本等区块链技术实现原理,对区块链商业价值和应用有一定的认知。 6 | 7 | 2. 至少熟悉一种开发语言。比如Solidity、Node.js、C++、Go等。 8 | 9 | 3. 至少熟悉一种区块链的智能合约开发。比如以太坊、超级账本、EOS等。 10 | 11 | 关于第一点正确理解区块链,可能是大多数人的一个坎。对于大部分人来说,最难的事情是克服心理上的障碍去拥抱一个新生事物。由于区块链技术比较新,有价值的书籍和资料比较少。片面和断章取义地理解都会误导大家,如果能够在一段时间里系统学习区块链,我认为这不是一件难事。第一章[区块链技术理论](./chapter1_00.md)目的就是帮助大家跨越认知门槛。 12 | 13 | 第二点至少熟悉一种开发语言,我认为也不难。不管是Solidity还是Node.js、golang(关于golang开发会在智能合约部分详细讲解)这方面的学习资料已经非常多了,大家可以选择一种开发语言进行深入全面地学习。比如以太坊智能合约开发使用的是Solidity语言,超级账本的Fabric支持Go语言、Node.js和Java, EOS目前使用的开发语言是C++。 14 | 15 | 大部分的编程语言都是由数据类型、逻辑结构、函数等组成,只不过不同语言语法不同而已。 16 | -------------------------------------------------------------------------------- /chapter2_03 three_questions_of_dev.md: -------------------------------------------------------------------------------- 1 | ## 区块链编程需要注意的问题 2 | 3 | 虽然智能合约开发与传统开发语言比较类似,但编程时需要注意以下三个问题: 4 | 5 | * 确定性(Deterministic) 6 | 7 | 确定性指的是一个程序每次给特定的输入会得到相同的输出,比如1+1=2,任何时候1+1都等于2。由于智能合约是运行在不同节点上的一段代码,因此必须确保代码输出结果的一致性。 8 | 9 | * 可终止(Terminable) 10 | 11 | 由于区块链资源有限,为了避免垃圾代码和恶意程序占用资源,通过情况会引入经济机制限制资源的浪费。比如以太坊智能合约需要支付一定的GAS费,而EOS上需要购买内存(RAM),并通过抵押方式换取一定的CPU和NET资源。运行在区块链上的智能合约一定要避免重复循环执行,必须在给定的条件下终止程序。比如超过某一个时间或者超过一定的费用,合约自动终止。 12 | 13 | * 代码隔离(Isolated) 14 | 15 | 在公链上,任何人都可以上传自己的智能合约,由于智能合约可能存在bug或者病毒,如果智能合约没有被隔离,就会影响整个区块链系统地运行,因此将智能合约运行在沙盒(SandBox)机制里可以有效避免合约对整个经济系统造成破坏。 16 | 17 | 以太坊虚拟机(EVM)是以太坊智能合约的运行环境。它不仅被沙盒封装起来,事实上它被完全隔离,也就是说运行在EVM内部的代码不能接触到网络、文件系统或者其它进程,甚至智能合约之间也只有有限的调用。 18 | 19 | EOS虚拟机采用的WebAssembly(WASM)是一个内存安全的沙盒执行环境虚拟机,为智能合约提供了安全保障。 20 | 21 | 超级账本Fabric使用了Docker来存放链上的代码,而不需要依靠特定的虚拟机,Docker为链码执行提供了一个安全、轻便的语言执行环境。 22 | 23 | 不同区块链使用的开发语言会有所不同,智能合约的特性也会有一些差别。 24 | -------------------------------------------------------------------------------- /chapter2_04 blockchain_engineer_skills.md: -------------------------------------------------------------------------------- 1 | ## 区块链开发工程师岗位技能要求 2 | 3 | 区块链开发工程师岗位技能要求: 4 | 1. 熟悉密码学、分布式、共识机制、P2P网络等技术; 5 | 2. 熟悉比特币、以太坊、超级账本、EOS等区块链技术实现原理; 6 | 3. 对区块链的商业价值和应用有一定的认知; 7 | 4. 熟悉Linux、Docker、Git等工具; 8 | 5. 至少熟悉一种开发语言,如Solidity、Node.js、C++、Go等; 9 | 6. 至少熟悉一种智能合约开发语言,如以太坊、超级账本、EOS等。 10 | 11 | 以上是区块链开发工程师的基本技能要求。在实际工作中,还会涉及区块链平台研发、区块链架构师等岗位。 12 | 13 | 区块链平台研发岗位要求熟悉主流区块链底层实现原理并有一定的区块链底层开发经验,熟悉BaaS、跨链等相关技术。 14 | 15 | 区块链架构师岗位重点关注系统架构设计,公链还涉及通证设计。要求对技术和应用都有一定的研究,能够指导工程师进行软件开发,并能钻研业务、设计合理的区块链应用场景。 16 | -------------------------------------------------------------------------------- /chapter2_05 selection_of_technology.md: -------------------------------------------------------------------------------- 1 | ## 区块链技术选型 2 | 3 | 我们在第一章介绍区块链技术原理的时候,提到了比特币、以太坊和超级账本这三种区块链技术平台,这里我们将三种平台做个对比,看看为什么在企业实施区块链的时候要采用超级账本。 4 | 5 |
6 | 7 | 8 | ![大话区块链](./pic/selection_of_technology.png "区块链技术选型") 9 | 10 | 2-05 区块链技术选型 11 |
12 | 13 | 从项目定位来看,比特币和以太坊都属于公链,只有超级账本是联盟链。大家都知道从2017年9月4日之后,我们国家是不允许发行数字货币的,而超级账本就是一种无币区块链。 14 | 15 | 在共识机制上,比特币和以太坊目前都采用了工作量证明机制,比特币每秒平均只有3-4笔交易,以太坊平均也只有每秒30笔交易。超级账本中的Fabric采用了Kafka、Raft、PBFT等共识机制供大家根据业务进行选择,可以将区块链效率提升到上千笔每秒。 16 | 17 | 除了效率之外,企业应用还存在隐私问题,Fabric采用授权机制和多通道机制可以有效保护用户隐私,是企业级区块链的首选平台。 18 | -------------------------------------------------------------------------------- /chapter2_06 summary.md: -------------------------------------------------------------------------------- 1 | ## 区块链开发实战预备知识总结 2 | 3 | 通过第一章我们对区块链有了初步的认识,这个章节主要解答大部分人对区块链开发的误区,并给出正确的答案。 4 | 5 | 从下一章Hyperledger Fabric架构详解章节,我们开始本课程的正式学习。 6 | 7 | 祝大家学习快乐! -------------------------------------------------------------------------------- /chapter3_00.md: -------------------------------------------------------------------------------- 1 | # 第三章 Hyperledger Fabric架构详解 2 | 3 | 在[区块链技术选型](./chapter2_05%20selection_of_technology.md)章节,我们讨论了超级账本与比特币、以太坊的差别,超级账本中的Fabric项目在效率和隐私保护都远远超过了公链的设计。 4 | 5 | 其实要做到这点也不难,联盟链的做法是限制成员加入——必须是经过认证通过的节点才能加入。由于节点需要认证,因此Hyperledger Fabric在设计上弱化了恶意攻击,在提高效率的同时还可以有效保护隐私,使得联盟链在企业实施变成可能。 6 | 7 | Hyperledger Fabric的最大的优势是支持共识机制、权限管理、密钥、账本机制等模块的可插拔。Fabric早期被很多人诟病,效率低下,有中心化嫌疑,现在的说法是不符合国产密码算法要求。提出这些问题的人一方面是没有产品研发能力,另一方面是没有用发展的眼光看待新生事物。 8 | 9 | 现在业内很多知名区块链公司包括趣链、纸贵科技等都是基于Fabric进行的产品研发,研发的方向主要是集中在共识机制、密码算法等方面。Fabric目前已经提供了1.4稳定版本,这个版本在很多方面都有了大的提升。 10 | 11 | 这个章节我们深入学习Hyperledger Fabric的设计架构。与一般只是理论学习的方式不一样,这个章节也会详细讲解Fabric网络的搭建和启动过程,让大家在Fabric实际网络中体会联盟链设计的精妙。 12 | 13 | 在正式阅读本章之前,默认你已经掌握了区块链工程师的必备工具: 14 | * 熟悉linux操作系统常用命令 15 | * 熟悉Docker常用命令 16 | * 熟悉Git基本知识 17 | 18 | 本章主要内容: 19 | * [Hperledger 项目简介](./chapter3_01%20hyperledger_project_overview.md) 20 | * [Hyperledger Fabric 网络体验——系统环境配置](./chapter3_02_part1%20hyperledger_fabric_network_prerequisites.md) 21 | * [Hyperledger Fabric 网络体验——Fabric网络环境](./chapter3_02_part2%20hyperledger_fabric_network_installing.md) 22 | * [Hyperledger Fabric 网络体验——网络启动过程概览](./chapter3_02_part3%20hyperledger_fabric_network_bring_up.md) 23 | * [Hyperledger Fabric 系统架构](./chapter3_03%20hyperledger_fabric_architecture.md) 24 | * [Hyperledger Fabric 核心组件](./chapter3_04%20hyperledger_fabric_core_components.md) 25 | * [Hyperledger Fabric 典型交易流程](./chapter3_05%20hyperledger_fabric_workflow_of_transaction.md) 26 | * [Hyperledger Fabric 架构详解知识总结](./chapter3_06%20summary.md) 27 | 28 | 注意:如果对以上必备工具还不熟悉,可以通过第三方资料先进行学习,或者参照[《大话区块链》](https://item.jd.com/12719282.html)一书中第二篇**区块链工程师基本能力**4.6章节**区块链工程师必备工具**。 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /chapter3_01 hyperledger_project_overview.md: -------------------------------------------------------------------------------- 1 | ## Hperledger 项目简介 2 | 3 | 超级账本是一组专注于跨行业分布式账本技术的开源项目,其主要目标是创建企业级、开源、分布式的分类框架和代码库来支持业务用例。 4 | 5 | 超级账本的关键目标之一不只是建立自己的分布式账本技术,更重要的是建立分布式账本技术的行业标准,鼓励更多企业参与到分布账本技术的建设和应用中来,形成一个开放的生态体系。 6 | 7 | 过去几年里,超级账本的发展速度非常快,截至2020年1月,超级账本由15个项目组成,其中6个是超级账本的框架(Hyperledger Frameworks),9个项目是支持这些框架的工具(Hyperledger Tools),这些项目的代码都开源在github上。 8 | 9 |
10 | 11 | 12 | ![大话区块链](./pic/hyperledger_greenhouse.png "超级账本项目") 13 | 14 | 3-01-01 超级账本项目 15 |
16 | 17 | 超级账本项目官方文档地址:https://www.hyperledger.org/projects 18 | 19 | 超级账本项目代码地址:https://github.com/hyperledger 20 | 21 | 1. 超级账本框架 22 | 23 | * **Hyperledger Fabric**是最早加入超级账本项目的顶级项目,Fabric 由IBM 、DAH 等企业于2015年底提交到社区。该项目的定位是面向企业的分布式账本平台,创新地引入了权限管理机制,设计上支持可插拔、可扩展,是首个面向联盟链场景的开源项目。 24 | 25 | * **Hyperledger Iroha**是由Soramitsu、日立、NTT Data和Colu提供。超级账本Iroha可以非常方便地集成到需要分布式账本技术的基础设施项目中。有别于其它超级账本框架,超级账本Iroha支持Android和iOS客户端库的移动应用程序开发。超级账本Iroha支持C++语言进行开发,采用了YAC共识机制。 26 | 27 | * **Hyperledger Sawtooth**是由Intel提供的一个区块链框架,它利用模块化平台构建、部署和运行分布式账本,支持物联网(IoT)芯片的接入。超级账本Sawtooth根据网络情况使用了动态共识算法——运行时间证明机制(Proof of Elapsed Time,PoET),该算法提供了较好的可扩展性,同时又不需要很高的能耗。PoET支持高度可伸缩的验证器节点网络。部署方式上Hyperledger Sawtooth支持公有链和联盟链两种方式。 28 | 29 | * **Hyperledger Indy**是为身份认证设计的一种分布式账本技术,可以很好地保护用户隐私。Hyperledger Indy的目标是通过开发一组分散的身份规范和组件,这些规范和组件独立于任何特定的分布式账本,并将支持分布式账本之间的操作。 30 | 31 | * **Hyperledger Burrow**的正式名称是iris-db,于2014年12月发布。Hyperledger Burrow是一款可授权的智能合约应用引擎,提供以太坊虚拟机的支持。 32 | 33 | 2. 超级账本工具 34 | 35 | 超级账本框架是用来构建区块链和分布式账本。超级账本工具是区块链的辅助软件,用于部署和维护区块链网络,检查账本数据以及区块链的设计和开发。这里重点介绍一下cello和explorer。 36 | 37 | * Hyperledger Cello 38 | 39 | Cello(/ˈtʃɛləʊ/)英文是大提琴的意思,通过Cello可以非常方便地创建、管理区块链服务,降低超级账本框架部署、维护的复杂度。 40 | 41 | Hyperledger Cello用来搭建区块链即服务(Block-as-a-Service,BaaS)平台。特别是对于想要降低区块链实施难度的中小型企业,Hyperledger Cello允许将区块链部署到云端。操作人员可以通过仪表盘创建和管理区块链,技术人员也可以非常方便地创建区块链实例。 42 | 43 | 作为超级账本模块,Cello的目标是将随需应变的“软件即服务(SaaS, Software as a service)”部署模型引入到区块链生态系统,从而帮助企业进一步开发和部署超级账本框架。Hyperledger Cello最初由IBM提供,赞助商包括Soramitsu、华为和英特尔。下图是超级账本Cello的操作示意图。 44 | 45 |
46 | 47 | 48 | ![大话区块链](./pic/hyperledger_cello.png "超级账本Cello的操作示意图") 49 | 50 | 3-01-02 超级账本Cello的操作示意图 51 |
52 | 53 | * Hyperledger Explorer 54 | 55 | Hyperledger Explorer是一种可视化区块链操作工具,是首个超级账本区块链浏览器,由DTCC、英特尔和IBM提供。 56 | 57 | Hyperledger Explorer旨在创建用户友好的Web应用程序,用户可以查看、调用、部署或查询区块,交易和交易相关数据,网络信息(名称、状态、节点列表),智能合约(智能合约代码和交易),存储在账本中的其它相关信息。 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /chapter3_02_part1 hyperledger_fabric_network_prerequisites.md: -------------------------------------------------------------------------------- 1 | ## Hyperledger Fabric 网络体验 2 | ### 系统环境配置 3 | 1. 操作系统 4 | 5 | 常见的Linux 发行版(包括Ubuntu 、Redhat 、CentOS 等)和MacOS 等都支持Fabric 编译和运行。 6 | 7 | 操作系统推荐支持64 位环境。开发环境计算机物理内存建议8 GB以上、虚拟机预留20GB硬盘空间。如果是在生产环境中对性能和稳定性要求高的场景下,甚至需要更多的物理资源。 8 | 9 | 本教程推荐采用[VirtualBox](https://www.virtualbox.org/wiki/VirtualBox)虚拟机安装Ubuntu 16.04 操作系统。 10 | 11 | 先下载安装VirtualBox,然后安装Ubuntu16.04版本。 12 | 13 | 具体操作请参照官方文档或者[《大话区块链》](https://item.jd.com/12719282.html)一书中**使用最广泛的linux操作系统乌班图**章节。 14 | 15 | 2. Docker and Docker Compose 16 | 17 | Docker 和 Docker Compose 版本建议使用Docker 19.03 Docker Compose 1.25。 18 | 19 | Docker目前有两个用途,第一个是方便Fabric的部署,另一个是Fabric网络目前采用Docker作为链码(智能合约)容器。 20 | 21 | Docker Compose项目是 Docker 官方的开源项目,用来实现对 Docker 容器集群的快速编排。Docker Compose定位是 “定义和运行多个 Docker 容器应用(Defining and running multi-container Docker applications)”。 22 | 23 | 例如,要实现一个 Web 项目,除了 Web 服务容器,还需要后端数据库容器,甚至还包括负载均衡容器等。 24 | 25 | Docker Compose恰好满足了上述需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)为一个项目定义一组相关联的应用容器。 26 | 27 | Docker的安装可以采用如下命令: 28 | 29 | 官方文档: 30 | https://docs.docker.com/install/linux/docker-ce/ubuntu/ 31 | 32 | ``` 33 | $ curl -fsSL https://get.docker.com -o get-docker.sh 34 | $ sudo sh get-docker.sh 35 | ``` 36 | 建立docker组: 37 | ``` 38 | $ sudo groupadd docker 39 | ``` 40 | 将当前用户加入 docker 组: 41 | ``` 42 | $ sudo usermod -aG docker $USER 43 | ``` 44 | 退出当前终端并重新登录,进行如下测试,出现下图提示信息表示Docker安装成功。 45 | 46 | ``` 47 | $ sudo docker run hello-world 48 | ``` 49 | 50 |
51 | 52 | 53 | ![大话区块链](./pic/docker_hello_world.png "Docker测试") 54 | 55 | 3-02-01 Docker测试 56 |
57 | 58 | 国内下载镜像的速度比较慢,可以使用国内镜像加速器。具体方式修改daemon配置文件/etc/docker/daemon.json使用加速器。下面以阿里云加速器地址为例。 59 | 60 | ``` 61 | sudo mkdir -p /etc/docker 62 | sudo tee /etc/docker/daemon.json <<-'EOF' 63 | { 64 | "registry-mirrors": ["https://hnm*****.mirror.aliyuncs.com"] 65 | } 66 | EOF 67 | sudo systemctl daemon-reload 68 | sudo systemctl restart docker 69 | ``` 70 | 71 | 镜像加速器地址可以从阿里云网站获取。 72 | 73 | 官网地址: 74 | https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 75 | 76 |
77 | 78 | 79 | ![大话区块链](./pic/aliyun_mirrors.png "阿里云镜像加速器") 80 | 81 | 3-02-02 阿里云镜像加速器 82 |
83 | 84 | Docker compose的安装可以采用如下命令: 85 | 官方文档:https://docs.docker.com/compose/install/ 86 | 87 | ``` 88 | # Run this command to download the current stable release of Docker 89 | # compose: 90 | sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 91 | 92 | # Apply executable permissions to the binary: 93 | sudo chmod +x /usr/local/bin/docker-compose 94 | ``` 95 | 3. Go Programming Language 96 | 97 | Ubuntu的apt-get自带的go语言版本太低,这里需要重新安装。由于fabric的开发语言是go语言,后续需要对fabric进行编译、运行,因此一定要安装最新版本的go语言环境,否则后面大部分工作无法正常开展。比如出现go path未配置的问题,其原因是go语言版本太低。 98 | 99 | * 使用以下指令进行go语言安装: 100 | ``` 101 | curl -O https://storage.googleapis.com/golang/go1.10.3.linux-amd64.tar.gz 102 | sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz 103 | ``` 104 | * 使用编辑器编辑当前用户环境变量: 105 | 在命令行下输入以下命令: 106 | ``` 107 | vi ~/.profile 108 | ``` 109 | 在文件末尾输入以下配置信息: 110 | ``` 111 | export GOROOT=/usr/local/go 112 | export GOPATH=$HOME/go 113 | export PATH=$PATH:$GOPATH/bin:$GOROOT/bin 114 | ``` 115 | 在vi编辑器中执行以下命令存盘并退出: 116 | ``` 117 | :wq 118 | ``` 119 | 120 | 在命令行下输入以下命令加载go语言环境变量: 121 | ``` 122 | source ~/.profile 123 | ``` 124 | 增加了工作组,并将当前用户加入 docker 组,如果还是无法使用,可以使用以下命令修改用户读写权限: 125 | 126 | ``` 127 | sudo chmod 666 /var/run/docker.sock 128 | ``` 129 | 4. Node.js Runtime and NPM 130 | 131 | Fabric官方目前支持Node.js开发区块链应用,建议使用Node长期支持版本(LTS)。建议使用NVM安装Node.js,NVM可以帮助我们方便的在Node的不同版本之间进行切换,这样我们就可以同时工作在不同的项目上。 132 | 133 | **本教程使用的node版本为8.x或10.x。** 134 | 135 | ``` 136 | # To download and install the nvm script run: 137 | # 下载并安装nvm脚本: 138 | 139 | $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash 140 | 141 | # close and reopen the terminal or run the commands to add the path to nvm script to the current shell session. 142 | # 切记nvm安装完毕,要么重新打开终端,要么设置nvm环境变量: 143 | 144 | # Using nvm install node 145 | # default install npm 146 | # 使用nvm安装node: 147 | $ nvm install node 8.0.0 148 | $ nvm install node 10.0.0 149 | 150 | #To list installed Node.js versions type: 151 | #显示已经安装node版本: 152 | $ nvm ls 153 | 154 | #You can change the currently active version with: 155 | #选择使用node版本,这里使用了10.0.0版本: 156 | $ nvm use 10.0.0 157 | 158 | ``` 159 | node版本维护可以参照官方文档: 160 | https://nodejs.org/en/about/releases/ 161 | 162 | -------------------------------------------------------------------------------- /chapter3_02_part2 hyperledger_fabric_network_installing.md: -------------------------------------------------------------------------------- 1 | ## Hyperledger Fabric 网络体验 2 | ### Fabric网络环境 3 | Fabric网络环境搭建有两种方式: 4 | 5 | **第一种方式是使用脚本文件直接安装。** 过程比较简单,比较适合学习和了解Fabric网络。 6 | 7 | https://hyperledger-fabric.readthedocs.io/en/release-1.4/install.html 8 | 9 | ``` 10 | curl -sSL http://bit.ly/2ysbOFE | bash -s -- 11 | curl -sSL http://bit.ly/2ysbOFE | bash -s -- 1.4.4 1.4.4 0.4.18 12 | ``` 13 | **第二种方式是手动安装。** 这个过程稍微有点复杂,但完整操作完成以后会对Fabric网络有更加深入的理解,方便后续自己手动搭建Fabric网络。这个过程需要手动逐个下载Fabric源代码、使用命令下载Fabric镜像和用Git下载例子程序。 14 | 15 | Fabric源代码主要用途是用来编译cryptogen、configtxgen及configtxlator。 16 | 使用命令下载必要的Fabric镜像,基本镜像有peer、orderer、ca、tools、ccenv及baseos。例子是官方提供的Fabric案例。 17 | 18 | **1. 下载源码** 19 | 20 | 将Fabric 代码按照Go 语言推荐方式进行存放,创建目录结构并切换到该目录下。具体命令如下: 21 | 22 | ``` 23 | # 创建目录 24 | $ mkdir -p $GOPATH/src/github.com/Hyperledger 25 | # 切换目录 26 | cd $GOPATH/src/github.com/Hyperledger 27 | # 下载fabric源码 28 | git clone https://github.com/hyperledger/fabric.git 29 | # 切换到fabric目录 30 | cd fabric 31 | # 切换到tag v1.4.4 32 | git checkout v1.4.4 33 | ``` 34 | **2.编译辅助工具** 35 | 36 | make命令是Linux下系统管理员使用最多的一个命令。管理员可以使用make命令编译和安装开源工具,用来管理大型复杂项目编译问题。由于构建一个复杂项目需要敲gcc命令进行编译,而且还要考虑文件依赖关系,使用make命令可以大幅度降低构建一个复杂工程的难度。 37 | 38 | make工具最基本的功能是调用Makefile文件, Makefile文件来描述一个工程的构建过程。当第一次执行make命令时,它会扫描Makefile找到目标及依赖文件,一旦依赖文件编译通过就会编译主目标文件。需要注意的是make命令每次只对修改后的文件进行编译。 39 | 40 |
41 | 42 | 43 | ![大话区块链](./pic/make_tools.png "Makefile") 44 | 45 | 3-02-03 Makefile 46 |
47 | 48 | 进入到fabric目录下,执行如下命令: 49 | 50 | ``` 51 | cd fabric 52 | #生成组织结构和身份文件 53 | $ make cryptogen 54 | #生成配置区块和配置交易 55 | $ make configtxgen 56 | # 解读配置信息 57 | $ make configtxlator 58 | ``` 59 | 编译完成后,我们就会在go/bin目录下看到cryptogen、configtxgen和configtxlator三个工具。 60 | 61 |
62 | 63 | 64 | ![大话区块链](./pic/fabric_tools.png "编译后的Fabric工具") 65 | 66 | 3-02-04 编译后的Fabric工具 67 |
68 | 69 | **3.下载镜像文件** 70 | 71 | Docker镜像可以从源代码编译生成,也可以从DockerHub仓库中下载。目前Fabric的镜像有十几个,本教程用到的主要镜像文件如下: 72 | 73 | * hyperledger/ fabric-ca # fabric-ca 镜像 74 | * hyperledger/ fabric-tools # 安装了peer 、cryptogen、configtxgen 等,可作为测试客户端使用支持 75 | * hyperledger/fabric-ccenv #go语言的链码基础镜像,其中安装了chaintool 、Go 语言的链码shim 层 76 | * hyperledger/ fabric-orderer #orderer节点镜像 77 | * hyperledger/ fabric-peer #peer节点镜像 78 | 79 | 如果我们没有对Fabric源码进行修改,可以直接从Dockerhub拉取相关镜像,命令格式为: 80 | Docker pull 81 | 82 | 要拉取本课程中使用到的镜像可以使用如下命令: 83 | 84 | ``` 85 | ARCH=x86_64 86 | IMAGE_TAG=1.4.4 87 | CA_VERSION=1.4.4 88 | BASE_IMAGE_VERSION=0.4.18 89 | 90 | # pull images 91 | 92 | docker pull hyperledger/fabric-peer:$IMAGE_TAG \ 93 | && docker pull hyperledger/fabric-orderer:$IMAGE_TAG \ 94 | && docker pull hyperledger/fabric-ca:$CA_VERSION \ 95 | && docker pull hyperledger/fabric-tools:$IMAGE_TAG \ 96 | && docker pull hyperledger/fabric-ccenv:$IMAGE_TAG \ 97 | && docker pull hyperledger/fabric-baseos:$BASE_IMAGE_VERSION 98 | 99 | # add fabric-peer fabric-orderer fabric-ca fabric-tools 100 | 101 | docker tag hyperledger/fabric-peer:$IMAGE_TAG hyperledger/fabric-peer \ 102 | docker tag hyperledger/fabric-orderer:$IMAGE_TAG hyperledger/fabric-orderer \ 103 | docker tag hyperledger/fabric-ca:$CA_VERSION hyperledger/fabric-ca \ 104 | docker tag hyperledger/fabric-tools:$IMAGE_TAG hyperledger/fabric-tools 105 | ``` 106 | 成功执行完命令之后,输入docker images就会出现如下镜像: 107 | 108 |
109 | 110 | 111 | ![大话区块链](./pic/fabric_docker_images.png "Fabric主要镜像文件") 112 | 113 | 3-02-05 Fabric主要镜像文件 114 |
115 | 116 | **4. 下载例子程序** 117 | 118 | 进入到Ubuntu用户目录下,输入以下命令下载例子程序,并切换与镜像文件相同的1.4.4版本,确保程序可以正常运行。 119 | 120 | ``` 121 | # clone the hyperledger/fabric-samples repository 122 | git clone https://github.com/hyperledger/fabric-samples.git 123 | 124 | # Checkout the appropriate version tag 125 | git checkout v1.4.4 126 | ``` 127 | 进入到fabric-examples目录下,可以看到fabcar和commercial paper两个例子,可以参考官方文档进行学习。 -------------------------------------------------------------------------------- /chapter3_02_part3 hyperledger_fabric_network_bring_up.md: -------------------------------------------------------------------------------- 1 | ## Hyperledger Fabric 网络体验 2 | ### 网络启动过程概览 3 | 4 | 现在使用刚才下载例子程序,输入以下命令进入first-networ目录: 5 | 6 | ``` 7 | cd fabric-samples/first-network 8 | ls 9 | ``` 10 | 可以看到该目录下docker-compose的配置文件和byfn.sh的脚本文件,输入以下命令: 11 | 12 | ``` 13 | ./byfn.sh 14 | ``` 15 | 可以查看该命令的使用说明。 16 | 输入默认命令: 17 | ``` 18 | ./byfn.sh up 19 | ``` 20 | 就会看到屏幕上显示的启动信息。作为第一次Fabric网络体验,我们先简单了解一下网络启动过程中都发生了那些事情。从大的方面来看,网络启动主要包含三个操作,分别是生成**配置文件**、**启动网络**和**操作网络**。 21 | 22 | **1. 配置文件** 23 | 24 | * 使用cryptogen tool生成证书文件(给组织颁发证书) 25 | * 生成Orderer节点的创世区块genesis.block(创世区块) 26 | * 生成通道配置交易文件 channel.tx(通道是fabric独有的机制,相当于是一个子链) 27 | * 为组织1和组织2创建锚节点(锚节点是一个负责对外通讯的节点) 28 | 29 |
30 | 31 | 32 | ![大话区块链](./pic/configure_file.png "配置文件") 33 | 34 | 3-02-04 配置文件 35 |
36 | 37 | **2. 启动网络** 38 | * 启动了4peer节点 39 | * 启动了一个orderer节点 40 | * 启动了一个管理工具 41 | 42 |
43 | 44 | 45 | ![大话区块链](./pic/bring_up.png "启动网络") 46 | 47 | 3-02-05 启动网络 48 |
49 | 50 | **3. 操作网络** 51 | 52 | * 创建mychannel通道 53 | 54 | * 组织1的Peer0加入mychannel通道 55 | * 组织1的Peer1加入mychannel通道 56 | * 组织2的Peer0加入mychannel通道 57 | * 组织2的Peer1加入mychannel通道 58 | 59 | * 更新组织1的锚节点 60 | * 更新组织2的锚节点 61 | 62 | * 将链码安装到组织1 的Peer0节点 63 | * 将链码安装到组织2 的Peer0节点 64 | 65 | * 链码初始化(只需要初始化一次) 66 | 67 | * 在组织1的peer0节点上进行链码查询(a=100) 68 | * 在组织1的peer0节点进行invoke操作(a向B转账10元) 69 | * 将链码安装到组织2的peer1节点上 70 | * 在组织2的peer1上查询链码(a=90) 71 | 72 |
73 | 74 | 75 | ![大话区块链](./pic/query_network.png "操作网络") 76 | 77 | 3-02-06 操作网络 78 |
-------------------------------------------------------------------------------- /chapter3_03 hyperledger_fabric_architecture.md: -------------------------------------------------------------------------------- 1 | ## Hyperledger Fabric系统架构 2 | ### 核心特性 3 | 目前,超级账本Fabric 架构的核心特性主要包括: 4 | 5 | * 解耦了原子排序环节与其他复杂处理环节,消除了网络处理瓶颈,提高了可扩展性;解耦交易处理节点的逻辑角色为背书节点( Endorser )、确认节点( Committer ),可以根据负载进行灵活部署; 6 | * 加强了身份证书管理服务,作为单独的Fabric CA 项目,提供更多功能; 7 | * 支持多通道特性,不同通道之间的数据彼此隔离,提高隔离安全性; 8 | * 支持可拔插的架构,包括共识、权限管理、加解密、账本机制等模块,支持多种类型; 9 | * 引人系统链码来实现区块链系统的处理,支持可编程和第三方实现。 10 | * 长期支持版本1.4,支持Raft共识机制。 11 | 12 | ### 技术架构 13 | Hyperledger Fabric是目前超级账本项目中发展最好的子项目,被广泛应用于跨企业的业务流程改造中。Fabric是一个分布式账本解决方案平台,采用模块化架构,支持不同组件的可插拔实现,以适应业务系统的复杂性。 14 | 15 | 与比特币、以太坊不同的是,Hyperledger Fabric网络成员加入依赖于成员服务提供者(Membership Service Provider, MSP)注册,而不是允许任何人通过工作量证明机制或者权益证明机制参与网络。 16 | 17 | 比特币网络中,由于任何成员都可以加入,因此需要采用工作量证明机制来防止用户作恶。Fabric节点加入需要身份认证,因此弱化了节点作恶,在性能和隐私保护方面足以满足政府、企业区块链应用的需求。 18 | 19 | 在Fabric中有一个独立的Fabric CA模块,用来管理证书服务,当然Fabric也允许第三方CA机构的接入。我们可以把Fabric CA想象成为Fabric区块链平台上的公安局,专门进行证书发放、管理和身份验证。 20 | 21 | 除支持多种MSP服务之外,Hyperledger Fabric还支持账本存储和共识机制的切换。 22 | 23 | 分布式账本支持LevelDB(由Google公司研发的键值对嵌入式数据库管理系统)和CouchDB(由Apache软件基金会开发的一个面向文档的开源数据库管理系统),CouchDB是一种key/value的数据存储方式,并且支持JSON格式的查询。 24 | 25 | 共识机制目前支持SOLO(只限于开发)和Kafka(一种消息平台)、Raft(相比Kafka更去中心化)三种。 26 | 27 | 隐私保护方面,Hyperledger Fabric还提供创建秘密通道(channel)的功能,允许一组参与者建立自己单独的通道。在企业实际业务中,由于一些参与者可能是竞争对手,如果不希望某些交易的价格被其他人知道,可以在参与者之间建立一个秘密通道,这些价格信息只有参与者知道,其他人无法获得具体价格信息。 28 | 29 | Hyperledger Fabric在公链技术的基础上,采用授权方式和通道机制(Channel),使得Fabric的安全和隐私保护方面已经达到了商用化的标准。 30 | 31 | Fabric首次将权限管理机制引人区块链领域,其可扩展的架构设计、开放的接口风格、可拔插的组件化实现为分布式账本平台的设计和实现提供了重要的参考依据。 32 | 33 | 从体系架构上看,Fabric分为四大模块,分别是成员服务、区块链服务、智能合约和应用编程接口。 34 | 35 |
36 | 37 | 38 | ![Fabric系统架构](./pic/fabric_architecture.png) 39 | 3-03-01 Fabric系统架构 40 |
41 | 42 | **1. 成员服务** 43 | 44 | 成员服务(MSP)主要提供证书发布、验证及相关加密机制和协议。成员服务内置了Fabric CA证书颁发机构(Certificate Authority,CA)供基于PKI体系的身份证书管理服务,同时也允许第三方证书认证机构接入。 45 | 46 | Fabric CA提供客户端和SDK两种方式与CA进行交互,每个Fabric CA都有一个根CA或者中间CA。为了保证CA的安全性,中间CA可以采用集群方式搭建。 47 | 48 |
49 | 50 | 51 | ![Fabric CA图表](./pic/fabric_ca_diagram.png) 52 | 3-03-02 Fabric CA图表 53 |
54 | 55 | 实践中,为了便于证书管理,一般使用根证书、业务证书、用户证书三级证书结构。根证书(最高级别的证书)用来签发业务证书,业务证书用来签发具体的用户证书,由此形成一个以根证书为顶层的树状结构,这种关系下,所有下层证书都会继承根证书的信任体系。 56 | 57 | 不同的交易环节中,Fabric使用了不同的业务证书,Enrollment Cert属于身份认证证书,Transaction Cert属于交易签名证书,TLS-Cert属于安全通讯证书。 58 | 59 |
60 | 61 | 62 | ![CA三级证书结构](./pic/public_key_infrastructure.png) 63 | 3-03-03 CA三级证书结构 64 |
65 | 66 | **2. 区块链服务** 67 | 68 | 区块链服务用于维护分布式账本。区块链服务包括P2P协议、分布式账本和共识机制管理。 69 | 70 | 1. **P2P协议** 71 | Fabric网络中,Peer和Orderer采用gRPC(Google RPC)对外提供远程服务,供客户端进行调用。网络中的节点之间通过Gossip 协议来进行状态同步和分发。 72 | 73 | 2. **共识机制** 74 | 区块链网络中,不同参与者之间,交易必须按照发生的顺序写入到分布式账本中。为此必须建立事务的顺序,并且采用一种共识机制拒绝错误(或恶意)的交易数据。 75 | 76 | Fabric允许根据实际业务需要选择合适的共识机制,目前支持SOLO、Kafka、Raft三种共识机制。 77 | 78 | 3. **分布式账本** 79 | 分布式账本包括两个组件:世界状态(world state)、事务日志,分布式账本是世界状态数据库和事务日志历史记录的组合。 80 | 81 | 世界状态(world state)组件记录的是最新的分布式账本状态,事务日志组件记录的是世界状态的更新历史。 82 | 83 | **3. 智能合约服务** 84 | 智能合约服务用于保证智能合约在网络节点上安全运行。 85 | 86 | 智能合约是一组运行在验证节点上的去中心化交易程序。在Fabric中智能合约被称为链码(chaincode),由外部应用程序(比如网页、APP)与分布式账本进行交互。 87 | 88 | Fabric的智能合约使用Docker存放链上的代码,而不需要依靠特定的虚拟机,Docker为链码执行提供了一个安全、轻便的语言执行环境。 89 | 90 | **4. 应用编程接口** 91 | 应用编程接口提供SDK(开发工具包)和CLI(命令行)两种方式供开发人员使用区块链的各种服务。Fabric提供了一套易用、可灵活扩展的API接口。用户可以非常方便地使用SDK(开发工具包)和CLI(命令行)对分布式账本进行查询、更新。 92 | 93 | **在网络搭建部分我们使用命令行的方式进行网络环境的验证,在实际案例开发中我们会使用SDK与网络进行交互。** 94 | -------------------------------------------------------------------------------- /chapter3_04 hyperledger_fabric_core_components.md: -------------------------------------------------------------------------------- 1 | ## Hyperledger Fabric核心组件 2 | 3 | 要理解Fabric的设计,需要对Fabric核心组件进行进一步学习掌握Fabric的底层运行原理,才能真正理解Fabric的设计初衷。 4 | 5 | ### Fabric网络(Network) 6 | 7 | 在Fabric网络中,Peer和Orderer采用gRPC(Google RPC)对外提供远程服务,供客户端进行调用。网络中的节点之间通过Gossip 协议来进行状态同步和分发。 8 | Gossip 协议是P2P 领域的常见协议,用于进行网络内多个节点之间的数据分发或信息交换。由于其设计简单,容易实现,同时容错性比较高,而被广泛应用到了许多分布式系。 9 | 10 | Gossip 协议的基本思想十分简单,数据发送方从网络中随机选取若干节点,将数据发送过去,接收方重复这一过程(往往只选择发送方之外节点进行传播)。这一过程持续下去,网络中所有节点最终(时间复杂度为节点总个数的对数)都会达到一致。数据传输的方向可以是发送方发送或获取方拉取。 11 | 12 | 与其它区块链节点一样,一个完整的区块链网络中各个节点会有不同分工。我们先看看比特币网络。每个比特币节点都是路由、区块链数据库、挖矿、钱包服务的功能集合,一个全节点包含钱包、矿工、完整区块链、网络路由节点。 13 | 14 |
15 | 16 | 17 | ![比特币网络](./pic/bitcoin_peers.png) 18 | 3-04 比特币网络 19 |
20 | 钱包节点一般是运行在PC和手机上的轻节点。钱包是比特币的重要组成部分,与大部分人理解不一样的是,钱包里没有比特币,只有比特币私钥。我们在钱包里看到的余额是钱包根据私钥计算得到的。在比特币等公链中,私钥是有用户保管的,一旦私钥丢失就意味着该用户的代币丢失。据说现在由于私钥保护不善,有300多万枚比特币已经丢失。 21 | 22 | 挖矿节点就是我们俗称的矿机。挖矿节点通过运行在特殊硬件设备上的工作量证明(proof-of-work)算法,以相互竞争的方式创建新的区块。一些挖矿节点同时也是全节点,保有区块链的完整拷贝;还有一些参与矿池挖矿的节点是轻量级节点,它们必须依赖矿池服务器维护的全节点进行工作。 23 | 24 | 目前,Fabric网络中存在以下4 种不同种类的服务节点,彼此协作完成整个区块链系统的功能。对网络中节点角色进行解耦是Fabric 设计中的一大创新,这也是联盟链场景下的特殊需求和环境所决定。 25 | 26 | * 背书节点( Endorser ):负责对交易的提案( proposal )进行验证并模拟交易执行; 27 | 28 | * 提交节点( Committer ): 负责在接受交易结果前再次检查合法性,接受合法交易对账本的修改,并写入区块链结构; 29 | 30 | * 排序节点( Orderer ) : 对所有发往网络中的交易进行排序,将排序后的交易按照配置中的约定整理为区块,之后提交给确认节点进行处理; 31 | 32 | * 证书节点( CA ): 负责对网络中所有的证书进行管理,提供标准的PKI服务。 33 | 34 | **通常情况下,除了用户节点,Fabric网络所有的全节点都具备Commiter功能,部分节点具有Endorser、Orderer功能。锚节点是一种外部可发现的节点,配置了对外服务的端口,如果某个Peer节点被配置成锚节点,这就意味着该节点可以被Orderer节点和其它任何节点发现。证书节点是一个相对独立证书管理机构,也可以由第三方证书机构来承担这个角色。** 35 | 36 | ### Fabric共识(Orderer) 37 | 38 | 在第一章节中,我们提到共识机制就是保证不同计算机之间信息的一致性。 39 | 40 | 在Fabric中,广义的共识机制包含背书、排序和验证三个环节,狭义的共识指的是排序。 41 | 42 | 所谓背书就是相关组织对交易的认可,在Fabric中是相关节点对交易进行签名。在比特币、以太坊等区块链上,网络上所有节点都可以生成有效的交易。而Fabric更符合真实世界的情况,交易验证由网络中业务相关方进行验证。对于一个链码交易来说,背书策略是在链码实例化的时候指定的,一笔有效交易必须是背书策略相关组织签名后才能生效。 43 | 44 | 举个例子,车辆交易就必须由买卖双方共同签署才能生效。背书策略的设计更符合真实世界情况。 45 | 46 | 排序服务通常由排序节点来提供,用来对全网交易达成一致顺序。排序服务只负责对交易顺序达成一致,这就有效避免了整个网络瓶颈,而且排序节点也很容易横向扩展,以提高整个网络的效率。排序服务目前支持Kafka和Raft两种。 47 | 48 | Fabric1.4.1中提供了Raft共识机制。Raft共识机制属于非拜占庭的共识机制,使用了领导者和跟随者(leader and follower)模型,当一个leader被选出,日志信息会从Leader向Follower单向复制。Raft比Kafka更容易管理,在设计上允许所有的节点都可以成为Orderer节点,相比Kafka更去中心化。 49 | 50 | 当然Fabric可插拔架构也允许根据业务需要设计符合拜占庭的共识机制,比如Practical Byzantine Fault Tolerance (PBFT ),但这种共识机制的性能往往比较差。 51 | 52 | 验证是对排序后的交易提交到账本之前最终的检查。检查的内容包含交易结构的合法性、交易背书签名是否符合背书策略等。 53 | 54 | ### Fabric账本(Ledger) 55 | 56 | 在第一章节时我们通过比特币讲解过交易、区块、区块链这些概念,这里我们通过Fabric复习一下。在比特币中,交易信息里只包含了货币相关信息,在Fabric中交易( transaction )可以存储相关业务信息,比如一个苹果、一条鱼等等。区块( block )是一组排序后的交易集合,将区块通过密码算法连接起来就是区块链。 57 | 58 | 账本( ledger )对区块链结构进行了进一步的延伸,是Fabric 中十分关键的一个结构。账本包含状态数据库(World State)和历史数据库。状态数据库记录的是变更记录的最新结果,方便查询,历史数据库记录的是区块链结构。在数据库选型上,为了方便查询,状态数据库会使用CouchDB,历史数据库会使用LevelDB。 59 | 60 | 在Fabric中,通道隔离了交易,因此每个通道都拥有独立账本。 61 | 62 | ### Fabric链码(Chaincode) 63 | 64 | 智能合约在Fabric中也被称为链码(chaincode)。 65 | 66 | 目前超级账本Fabric 项目中提供了用户链码和系统链码。用户链码运行在单独的容器中,提供对上层应用的支持。系统链码则嵌入在系统内,提供对系统进行配置、管理的支持。 67 | 68 | 一般所谈的链码为用户链码,用户通过链码相关的API 编写用户链码,即可对账本中状态进行更新操作。系统链码有以下五个合约: 69 | 70 | * Configuration System Chaincode (CSCC) 71 | CSCC 管理peer上通道相关的信息以及执行通道配置交易。 72 | 73 | * Life Cycle System Chaincode (LSCC) 74 | LSCC 用于管理链码的生命周期——在peer上安装链码、在通道上实例化和升级链码、用户从运行中的链码获取信息。 75 | 76 | * Query System Chaincode (QSCC) 77 | 运行在所有Peer上,提供账区块查询、交易查询等API。 78 | 79 | * Endorser System Chaincode (ESCC) 80 | ESCC 由背书节点调用,对一个交易响应进行密码签名。 81 | 82 | * Validator System Chaincode (VSCC) 83 | VSCC 由记账节点调用, 包括检查背书策略和读写集版本。 84 | 85 | 链码经过安装和实例化操作后,即可被调用。在安装时候,需要指定具体安装到哪个Peer 节点,实例化时还需要指定通道内及背书策略。链码之间还可以通过互相调用,创建更灵活的应用逻辑。Fabric 目前主要支持基于Go 语言、Java、Node.js。 86 | -------------------------------------------------------------------------------- /chapter3_05 hyperledger_fabric_workflow_of_transaction.md: -------------------------------------------------------------------------------- 1 | ## Hyperledger Fabric 典型交易流程 2 | 3 | 理解了Fabric设计之后,我们再进一步了解一下交易在Fabric组件之间的工作流程。一个完整的交易要涉及应用程序、证书服务、背书节点、提交节点和排序节点。 4 | 5 | * 应用程序(App):调用Fabric SDK与区块链网络进行交互,这里的应用程序可以是网页,也可以是APP; 6 | 7 | * 证书节点( CA ):负责对网络中所有的证书进行管理,提供标准的PKI服务; 8 | 9 | * 背书节点( Endorser ):负责对交易的提案( proposal)进行验证并进行模拟执行。背书节点相当于中立的第三方,用来保证交易的合法性; 10 | 11 | * 排序节点( Orderer ):对所有发往网络中的交易进行排序,将排序后的交易按照配置中的约定整理为区块,之后广播给提交节点(committer)进行处理; 12 | 13 | * 提交节点( Committer ):负责再次检查交易的合法性,接受合法交易对账本的修改,并写入区块链结构。 14 | 15 |
16 | 17 | 18 | ![Fabric典型交易流程](./pic/fabric_workflow_of_transaction.png) 19 | 3-05 Fabric典型交易流程 20 |
21 | 22 | 上图中,客户端(App)使用SDK与Fabric网络进行交互。 23 | 24 | 1. 客户端先通过证书服务获取合法的身份并加入到应用通道(Channel)中。 25 | 26 | 2. 客户端构造交易请求(Proposal)提交给背书节点(Endorser)。 27 | 28 | 3. 背书节点对交易进行验证和模拟执行后(并不真正更新账本),反馈给客户端。 29 | 30 | 4. 客户端收到足够的背书支持后将交易发送给Orderer节点。 31 | 32 | 5. Orderer节点对网络中的交易进行全局排序,并将排序后的交易打包成区块,然后广播给网络中的提交节点(Committer)。 33 | 34 | 6. 提交节点(Committer)负责维护区块链和账本结构,对交易进行最终检查(交易结构的合法性、交易背书签名是否符合背书策略等),检查通过后写入账本。 -------------------------------------------------------------------------------- /chapter3_06 summary.md: -------------------------------------------------------------------------------- 1 | ## Hyperledger Fabric 架构详解知识总结 2 | 3 | 通过网络体验和架构详解,我们对区块链以及联盟链的设计有了更加深入的理解。 4 | 5 | 下一章我们会重点学习Fabric网络的搭建,在继续深入理解区块链原理的同时,掌握具备区块链的一项实战能力——区块链网络搭建,其他两个实战能力——智能合约开发和应用开发,我们会在第五章和第六章深入学习。 6 | 7 | 祝大家学习快乐! -------------------------------------------------------------------------------- /chapter4_00.md: -------------------------------------------------------------------------------- 1 | # 第四章 Hyperledger Fabric 网络搭建详解 2 | 3 | 之前介绍过我的工作情况,在我开始从事管理工作之后,很长时间都是在与人打交道,对内要管理技术团队,对外要与客户进行沟通,所以我花在技术开发上的工作明显少了很多。 4 | 5 | 在从事区块链之后,我也将更多的精力放在了区块链技术理论的学习上,但由于区块链技术比较新,了解区块链的人很少,一方面,很多时候只看文字性的东西很难对区块链有更深入的理解,另一方面,即使有很好的想法身边也没有人能够帮助我进行落地。 6 | 7 | 痛定思痛我开始重拾技术,从环境搭建开始、再到代码实现就这样一步一步走过来,这个过程中我对技术又有了新的认知。当然我这个过程并不顺利。由于很多年都没有动手搭建过环境、写过代码,经常看这个官方文档就是死活搞不定,一次次的打击把我逼到技术的边缘,曾经一度想放弃区块链,还是回去上班算了。 8 | 9 | 但是由于我对区块链技术有强烈浓厚的兴趣,迫使我开始一边一边尝试、查找问题,经过了一段时间魔鬼式的训练之后,我又满血复活。这段经历让我对困难有了新的认识——千万不要害怕困难,因为只有困难才能让我们快速成长,难道你不想成长吗?难道你不想进步吗?我想能学习区块链技术的你肯定愿意成长、肯定愿意进步,那就让我从爱上困难开始。 10 | 11 | 现在我对学习新技术都已经没有啥害怕的了,而且我还专门讲自己学习的心法写了出来,放到了《大话区块链》这本书里。 12 | 13 | **第一,克服心理障碍。** 大部分人做不好一件事情的原因,不是自己脑子笨,也不是事情有多难。根本上是无法克服学习的恐惧心理,对于一件新事物有心理障碍。所以我们要做的第一件事情就是告诉自己:我一定可以学会区块链开发,我一定能学会区块链开发,我一定会学会区块链开发,最终你会发现区块链开发其实真的不难。 14 | 15 | **第二,保持耐心。** 很多人在学习一项新技能的时候缺乏耐心,在尝试了一两次失败之后就直接放弃,告诉自己这东西我学不会。但是,我们忘了一个基本的事实——任何人学习一项新的技能,都是经历了很多次的失败之后才最终掌握一项新的技能。 16 | 17 | **第三,刻意模仿并不断重复练习。** 即使我将区块链开发技能进行了拆解,但在这个过程你还是会遇到困难,一开始只需模仿就行,时间久了你就会自然理解。这就如同我们小时候背诵古诗一样,很多时候我们不一定理解古诗的意思,但随着时间的流逝,突然有一天我们会恍然大悟。 18 | 19 | 最后需要强调的是任何一项新的技能都需要不断重复地练习,到最后这项技能就会刻在你的脑子里,最终成为你一辈子的财富。千万不要认为一次学习就可以掌握一项新的技能,即使是行业从业者,也是经历了很多次的练习。 20 | 21 | 分享完我的学习经历之后,接下来我们详细讲解一个完整的Fabric网络搭过程。 22 | 23 | 本章主要内容: 24 | * [网络概况5 Orderer +4 Peer+1 CLI](./chapter4_01%20fabric_network_overview.md) 25 | * [生成证书文件](./chapter4_02%20generate_certificate.md) 26 | * [生成交易相关文件](./chapter4_03%20configuration_transaction.md) 27 | * [启动网络节点](./chapter4_04%20bring_up_network.md) 28 | * [网络配置](./chapter4_05%20create_join_channel.md) 29 | * [网络测试](./chapter4_06%20test_fabric_network.md) 30 | * [网络搭建详解知识总结](./chapter4_07_summary.md) 31 | 32 | 注意:本章内容主要基于[Fabric官方文档](https://hyperledger-fabric.readthedocs.io/en/release-1.4/build_network.html#)的Tutorials » Building Your First Network。 -------------------------------------------------------------------------------- /chapter4_01 fabric_network_overview.md: -------------------------------------------------------------------------------- 1 | ## 网络概况(5 Orderer +4 Peer+1 CLI) 2 | 下面要搭建的Fabric 网络中包含5个Orderer节点、Org1和Org2两个组织的四个Peer 节点,以及一个管理节点。 3 | 4 | * Orderer节点采用了Raft共识机制。 5 | * 四个Peer 节点分属于同一个管理域(example.com )下的两个组织Org1和Org2 ,这两个组织都加入同一个应用通道( my-channel)中。 6 | * 每个组织中的第一个节点(peer0节点) 作为锚节点与其他组织进行通信,所有节点通过域名都可以相互访问。 7 | * 管理节点的作用是在网络启动后供通过命令行进行通道及链码的操作。 8 | 9 |
10 | 11 | 12 | ![Fabric网络搭建过程](./pic/fabric_network_setup.png "Fabric网络搭建过程") 13 | 14 | 4-01 Fabric网络搭建过程 15 |
16 | 17 | 入上图所示,要启动一个Fabric 网络,需要遵循如下的主要步骤: 18 | 19 | **生成证书文件** 20 | 1.生成节点和Orderer对应的证书文件(可以使用cyptogen工具完成)。 21 | 22 | **生成交易相关文件** 23 | 2. 生成Orderer的创世区块文件、通道的配置交易文件以及需要的锚节点交易文件(使用configtxgen 工具完成)。 24 | 25 | **启动网络节点** 26 | 3. 使用创世区块文件、证书文件启动Orderer节点。此时Orderer 采用指定的创世区块文件创建了系统通道。 27 | 4. 根据组织文件分别启动Peer 节点。这个时候网络中不存在应用通道,Peer 节点也并没有加入网络中,也没有与Orderer 服务建立连接。需要通过客户端对其进行操作,让它加入网络和指定的应用通道中。 28 | 29 | **网络配置** 30 | 5. 使用配置交易文件,向系统通道发送交易,创建新的应用通道。 31 | 6. 让对应的Peer 节点加入所创建的应用通道中,此时Peer 节点加入网络,可以准备接收交易了。 32 | 33 | **网络测试** 34 | 7. 用户通过客户端安装、初始化链码,链码容器启动后用户即可对链码进行调用(invoke、query)。 35 | -------------------------------------------------------------------------------- /chapter4_02 generate_certificate.md: -------------------------------------------------------------------------------- 1 | ## 生成证书文件 2 | 3 | 使用cryptogen工具为Orderer节点和Peer节点生成证书文件。这些证书文件用来代表节点Orderer节点和Peer节点的身份,用于节点之间通讯加密和交易签名、验签。 4 | 5 | 生成证书文件需要依赖crypto-config.yaml文件。crypto-config.yaml包含了网络的拓扑结构,使用cryptogen工具根据网络拓扑为每个Peer节点和Orderer节点生成对应的证书文件。使用这些证书的私钥和公钥可以对Fabric网络中通讯和交易进行加密和签名。 6 | 7 |
8 | 9 | 10 | ![crypto-config.yaml文件](./pic/auto/image053.jpg "crypto-config.yaml文件") 11 | 12 | 4-02_01 crypto-config.yaml文件 13 |
14 | 15 | 在网络根目录下,输入以下命令: 16 | ``` 17 | cryptogen generate --config=./crypto-config.yaml 18 | ``` 19 | 在命令行会输出以下信息。 20 | ``` 21 | org1.example.com 22 | org2.example.com 23 | ``` 24 | 在当前目录下会生成一个crypto-config目录,该目录下生成了Orderer节点和Peer节点对应的证书文件(如下所示)。 25 | 26 | ``` 27 | ├── ordererOrganizations 28 | │ └── example.com 29 | │ ├── ca 30 | │ │ ├── 4543ec84197ce3c473e1cc8ab90af59e2b439303189cc96a1d776455288e10e4_sk 31 | │ │ └── ca.example.com-cert.pem 32 | │ ├── msp 33 | │ │ ├── admincerts 34 | │ │ ├── cacerts 35 | │ │ ├── config.yaml 36 | │ │ └── tlscacerts 37 | │ ├── orderers 38 | │ │ ├── orderer2.example.com 39 | │ │ ├── orderer3.example.com 40 | │ │ ├── orderer4.example.com 41 | │ │ ├── orderer5.example.com 42 | │ │ └── orderer.example.com 43 | │ ├── tlsca 44 | │ │ ├── 01337266be631763d6a7f67d81ffc531e0f5ef8991a5f627090e9416112c19f9_sk 45 | │ │ └── tlsca.example.com-cert.pem 46 | │ └── users 47 | │ └── Admin@example.com 48 | └── peerOrganizations 49 | ├── org1.example.com 50 | │ ├── ca 51 | │ │ ├── 1d01bec3ab8d756d020bd905e68ec8a4e084a3d7b081c992b2f7d27def07618f_sk 52 | │ │ └── ca.org1.example.com-cert.pem 53 | │ ├── msp 54 | │ │ ├── admincerts 55 | │ │ ├── cacerts 56 | │ │ ├── config.yaml 57 | │ │ └── tlscacerts 58 | │ ├── peers 59 | │ │ ├── peer0.org1.example.com 60 | │ │ └── peer1.org1.example.com 61 | │ ├── tlsca 62 | │ │ ├── deb1c11cec0feb94c7b6a8245b4fa5de38d52162782aefcdb4e75b8733880986_sk 63 | │ │ └── tlsca.org1.example.com-cert.pem 64 | │ └── users 65 | │ ├── Admin@org1.example.com 66 | │ └── User1@org1.example.com 67 | └── org2.example.com 68 | ├── ca 69 | │ ├── 997766aa43eacbf419d8b23ffb8c4b64a9c97de22a1bb5abd05f96f526c0574b_sk 70 | │ └── ca.org2.example.com-cert.pem 71 | ├── msp 72 | │ ├── admincerts 73 | │ ├── cacerts 74 | │ ├── config.yaml 75 | │ └── tlscacerts 76 | ├── peers 77 | │ ├── peer0.org2.example.com 78 | │ └── peer1.org2.example.com 79 | ├── tlsca 80 | │ ├── 40e7ef86f4cac43273b6f67df8bf94278389a5eb4e0bc2d393a8e4f620cc794d_sk 81 | │ └── tlsca.org2.example.com-cert.pem 82 | └── users 83 | ├── Admin@org2.example.com 84 | └── User1@org2.example.com 85 | 86 | ``` 87 | **知识点:** 88 | 89 | cryptogen 模块生成的文件中包含了Fabric 账号相关的证书文件。为满足区块链的不可篡改特性,Fabric 中每条交易都会加上发起者的签名。如果交易需要其他组织的节点提供背书功能,那么背书节点也会在交易中加入自己的签名。这样每一笔交易的操作过程会非常清晰并且不可篡改。 90 | 91 | ``` 92 | ├── msp 93 | │ ├── admincerts 94 | │ ├── cacerts 95 | │ ├── config.yaml 96 | │ └── tlscacerts 97 | 98 | ``` 99 | * admincerts 包含了PEM格式的管理员证书文件。 100 | * cacerts 包含了PEM格式的CA根证书文件。 101 |
102 | 103 | 104 | ![ca.org1.example.com-cert.pem文件](./pic/auto/image054.jpg) 105 | 106 | 4-02_02 ca.org1.example.com-cert.pem文件 107 |
108 | 109 | * config.ymal 用来配置支持的组织单元和身份分类的配置文件。 110 |
111 | 112 | 113 | ![config.yaml文件](./pic/auto/image055.jpg) 114 | 115 | 4-02_03 config.yaml文件 116 |
117 | 118 | * tlscacerts 包含了PEM格式的TLS CA根证书文件。 -------------------------------------------------------------------------------- /chapter4_03 configuration_transaction.md: -------------------------------------------------------------------------------- 1 | ## 生成交易相关文件 2 | 使用configtxgen工具生成Orderer的创世区块文件、通道配置交易文件以及锚节点交易文件。 3 | 4 | 创世区块是Orderer服务的第一个区块,通道配置文件会在之后创建通道时广播到Orderer节点,锚节点交易文件是指定各组织对外通讯的节点。 5 | 6 | 生成交易相关文件需要依赖configtx.yaml文件。configtx.yaml文件包含了网络中的组织信息,其中包含一个Orderer组织(OrdererOrg)和两个Peer组织(Org1和Org2)。特别要注意的是在文件末尾有几个独立的profiles,定义了不同共识机制对的应创世区块,SampleConsortium下定义了Org1和Org2两个组织。 7 | 8 | * TwoOrgsOrdererGenesis: 生成Solo共识机制的创世区块。 9 | * SampleMultiNodeEtcdRaft: 生成Raft共识机制的创世区块。 10 | * SampleDevModeKafka: 生成Kafka共识机制的创世区块。 11 | * TwoOrgsChannel: 为mychannel生成创世区块。 12 | 13 |
14 | 15 | 16 | ![configtx.yaml文件1](./pic/auto/image056.jpg) 17 | 18 | 4-03_01 configtx.yaml文件1 19 | ![configtx.yaml文件2](./pic/auto/image057.jpg) 20 | 21 | 4-03_02 configtx.yaml文件2 22 |
23 | 24 | ### 生成创世区块文件 25 | 26 | 在网络根目录下,输入以下命令: 27 | 28 | ``` 29 | # 定义Fabric配置文件路径环境变量 30 | export FABRIC_CFG_PATH=$PWD 31 | ``` 32 | 以下命令使用profile TwoOrgsOrdererGenesis 创建Solo共识机制的创世区块。 33 | ``` 34 | configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block 35 | ``` 36 | 以下命令使用profile SampleDevModeKafka创建Kafka共识机制的创世区块。 37 | ``` 38 | configtxgen -profile SampleDevModeKafka -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block 39 | ``` 40 | 以下命令使用profile SampleMultiNodeEtcdRaft创建Raft共识机制的创世区块。 41 | ``` 42 | configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block 43 | ``` 44 | **为了符合生产环境网络情况,本教程采用Raft共识机制创建创世区块**,执行完命令输出以下信息: 45 |
46 | 47 | 48 | ![成功创建创世区块](./pic/auto/image058.jpg) 49 | 50 | 4-03_03 成功创建创世区块 51 |
52 | 53 | 创世区块文件和后续的文件都会保存在channel-artifacts目录下。这里的channelID是系统通道的名字。 54 | 55 | ### 生成通道配置文件 56 | **创建通道配置交易文件**。执行以下命令: 57 | ``` 58 | # The channel.tx artifact contains the definitions for my channel 59 | 60 | export CHANNEL_NAME=mychannel && configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME 61 | ``` 62 | 执行完命令后输出以下信息: 63 |
64 | 65 | 66 | ![成功创建应用通道配置交易文件](./pic/auto/image059.jpg) 67 | 68 | 4-03_04 成功创建应用通道配置交易文件 69 |
70 | 71 | **生成锚节点交易文件。** 为Org1和Org2生成锚节点交易文件。输入以下命令: 72 | ``` 73 | configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP 74 | 75 | 76 | configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP 77 | ``` 78 |
79 | 80 | 81 | ![成功创建锚节点](./pic/auto/image060.jpg) 82 | 83 | 4-03_05 成功创建锚节点 84 |
85 | **注意:创世区块文件、通道配置交易文件以及需要的锚节点交易文件生成后会在channel-artifacts目录下生成channel.tx、genesis.block、 Org1MSPanchors.tx 、Org2MSPanchors.tx四个文件。** 86 | 87 | 88 | **通道知识点** 89 | 90 | 通道是Fabric中非常重要的概念,它实际上是由排序节点划分和管理的私有原子广播通道,目的是对通道的信息进行隔离,使得通道外的实体无法访问通道内的信息,从而实现交易的隐私性。 91 | 92 | 目前通道分为系统通道(System Channel)和应用通道(Application Channel)。排序节点通过系统通道来管理应用通道,用户的交易信息通过应用通道传递。对一般用户来说,通道是指应用通道。 93 | 94 | -------------------------------------------------------------------------------- /chapter4_04 bring_up_network.md: -------------------------------------------------------------------------------- 1 | ## 启动网络节点 2 | 3 | 证书、创世区块文件、通道配置交易文件以及锚节点交易文件准备好后,输入以下命令启动Raft网络。 4 | 5 | ``` 6 | docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml up 7 | ``` 8 | 如这时候会在屏幕看到如下图显示的Orderer、Peer日志启动信息,这个过程需要一点时间(如果不想看到日志信息可以在上面docker-compose命令加上 -d ,让Orderer和Peer节点在后台启动)。 9 | 10 |
11 | 12 | 13 | ![成功启动Fabric网络](./pic/auto/image062.jpg) 14 | 15 | 4-04_01 成功启动Fabric网络 16 |
17 | 18 | 打开一个新的命令窗口,输入以下命令: 19 | ``` 20 | # 显示所有的容器 21 | docker ps 22 | ``` 23 |
24 | 25 | 26 | ![查看所有容器](./pic/auto/image063.jpg) 27 | 28 | 4-04_02 查看所有容器 29 |
30 | 31 | 从上图可以看到启动了5个Orderer节点,四个Peer节点和一个命令行管理节点。 32 | 33 | **Docker Compose知识点** 34 | 35 | 在命令行输入docker-compose [-f ...] [options] [COMMAND] [ARGS...] 可以在容器中build和管理多个服务。在命令行输入docker-compose –help 可以看到帮助信息。 36 | 37 | ``` 38 | Define and run multi-container applications with Docker. 39 | 40 | Usage: 41 | docker-compose [-f ...] [options] [COMMAND] [ARGS...] 42 | docker-compose -h|--help 43 | 44 | Options: 45 | -f, --file FILE Specify an alternate compose file 46 | (default: docker-compose.yml) 47 | -p, --project-name NAME Specify an alternate project name 48 | (default: directory name) 49 | --verbose Show more output 50 | --log-level LEVEL Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) 51 | --no-ansi Do not print ANSI control characters 52 | -v, --version Print version and exit 53 | -H, --host HOST Daemon socket to connect to 54 | 55 | --tls Use TLS; implied by --tlsverify 56 | --tlscacert CA_PATH Trust certs signed only by this CA 57 | --tlscert CLIENT_CERT_PATH Path to TLS certificate file 58 | --tlskey TLS_KEY_PATH Path to TLS key file 59 | --tlsverify Use TLS and verify the remote 60 | --skip-hostname-check Don't check the daemon's hostname against the 61 | name specified in the client certificate 62 | --project-directory PATH Specify an alternate working directory 63 | (default: the path of the Compose file) 64 | --compatibility If set, Compose will attempt to convert deploy 65 | keys in v3 files to their non-Swarm equivalent 66 | 67 | Commands: 68 | build Build or rebuild services 69 | bundle Generate a Docker bundle from the Compose file 70 | config Validate and view the Compose file 71 | create Create services 72 | down Stop and remove containers, networks, images, and volumes 73 | events Receive real time events from containers 74 | exec Execute a command in a running container 75 | help Get help on a command 76 | images List images 77 | kill Kill containers 78 | logs View output from containers 79 | pause Pause services 80 | port Print the public port for a port binding 81 | ps List containers 82 | pull Pull service images 83 | push Push service images 84 | restart Restart services 85 | rm Remove stopped containers 86 | run Run a one-off command 87 | scale Set number of containers for a service 88 | start Start services 89 | stop Stop services 90 | top Display the running processes 91 | unpause Unpause services 92 | up Create and start containers 93 | version Show the Docker-Compose version information 94 | ``` -------------------------------------------------------------------------------- /chapter4_07_summary.md: -------------------------------------------------------------------------------- 1 | ## Hyperledger Fabric 网络搭建详解知识总结 2 | 3 | 本章通过搭建一个采用Raft共识机制的Fabric网络,完整讲解了生成证书、生成交易相关文件、启动网络节点、网络配置和网络测试。这里需要强调的只有勤动手、多练习才能掌握Fabric网络的搭建。 4 | 5 | 下一章我们开始学习智能合约开发。 6 | 7 | 祝大家学习快乐! -------------------------------------------------------------------------------- /chapter5_00.md: -------------------------------------------------------------------------------- 1 | # 智能合约开发 2 | 3 | 提到套路,大家第一感觉是不好。生活中有很多套路,比如小学生写作文的套路:先说一个自己曾经经历的事儿,然后来一句“那一刻,我明白了…..”。 4 | 5 | 套路容易让思维僵化,但写程序尤其是写智能合约却非常需要套路。套路不仅可以提高我们的学习效率,而且还可以大幅度提高我们写程序的质量。进一步来说掌握的套路越多,你就越逼近高手。 6 | 7 | 以前在带团队的时候,经常碰到一些程序员代码没有注释、格式乱七八糟、没有必要的错误处理,导致软件出现各种奇奇怪怪的问题,这都是因为没有经过正规训练。 8 | 9 | 由于智能合约不同于一般程序开发,对效率要求很高,而且升级比较麻烦,因此要成为一名合格的区块链开发工程师,必须先从掌握套路开始。 10 | 11 | 如果大家以后如果要做公链开发,一定要多多掌握套路,因为一个bug就可能导致巨大的经济损失。 12 | 13 | 比如美链(BeautyChain)就因为智能合约bug导致整个项目几乎归零。 14 | 15 | >2018年4月23日中午11点30分左右,黑客利用了Solidity语言的整形溢出漏洞,成功转走了两笔超大数量的BEC Token,导致市场上海量 BEC 被抛售,该数字货币价值几乎归零,给 BEC 市场交易带来了毁灭性打击。 16 | 17 | 讲这么多没有别的意思,就是希望大家明白智能合约开发与我们之前web开发不一样,大家需要严肃对待。 18 | 19 | Fabric的开发主要包含智能合约(链码)开发和基于Fabric SDK的应用开发。 20 | 21 | 虽然Fabric链码开发支持Java、Node.js开发,但由于Fabric是基于Go语言开发的,因此本教程建议使用Go语言进行智能合约的开发。本章节主要讲解链码开发,关于应用开发会在第6章区块链溯源案例分析章节详细讲解。 22 | 23 | 搭建Fabric网络环境时,我们学习了在Ubuntu上安装Go语言环境以及Fabric网络搭建,已经初步具备chaincode的开发和调试能力。但由于在Fabric网络中测试链码需要不断的重启网络,会严重影响开发效率,同时也不便于chaincode的开发、测试。 24 | 25 | 本章节我们以Windows10为例(其它平台大同小异,有需要的朋友可以自行摸索),详细讲解怎样进行本地开发环境搭建、Golang核心知识、链码基本概念、链码开发、单元测试,方便开发者进行链码开发和调试。 26 | 27 | 本章主要内容: 28 | * [开发环境](./chapter5_01%20smartcontract_dev_env.md) 29 | * [Golang核心知识](./chapter5_02_part1%20golang_core.md) 30 | * [Golang核心知识——数据类型](./chapter5_02_part2%20golang_core.md) 31 | * [Golang核心知识——函数、流程控制及方法](./chapter5_02_part3%20golang_core.md) 32 | * [Golang核心知识——指针接收器及接口](./chapter5_02_part4%20golang_core.md) 33 | * [链码基本概念](./chapter5_03%20chaincode_concept.md) 34 | * [链码开发](./chapter5_04%20chaincode_dev.md) 35 | * [单元测试](./chapter5_05%20chaincode_unit_test.md) 36 | * [智能合约开发知识总结](./chapter5_06%20summary.md) -------------------------------------------------------------------------------- /chapter5_01 smartcontract_dev_env.md: -------------------------------------------------------------------------------- 1 | ## 开发环境 2 | 3 | ### Go语言的安装 4 | 官方文档:https://golang.google.cn/ 5 | 6 | Go语言提供windwos、linux、mac下载安装。大家根据自己的机器环境选择安装。 7 | 8 |
9 | 10 | 11 | ![Golang下载](./pic/auto/image080.jpg) 12 | 13 | 5-01_01 Golang下载 14 |
15 | 16 | Windows下安装Go语言非常方便,根据向导一步一步操作即可。 17 | 18 | ### Visual Studio Code的安装与配置 19 | 20 | 官方文档:https://code.visualstudio.com/ 21 | 22 | VS code提供windwos、linux、mac下载安装。大家根据自己的机器环境选择安装。以下以Win10为例。 23 | 24 | **1. 安装VS Code** 25 | 26 |
27 | 28 | 29 | ![VS code下载](./pic/auto/image081.jpg) 30 | 31 | 5-01_02 VS code下载 32 |
33 | 34 | 安装完成后,windows下使用快捷键win+R调出运行框,输入code,启动VS code编辑器。 35 | 36 | **2. 安装go语言插件** 37 | 38 | 官方文档:https://code.visualstudio.com/docs/languages/go 39 | 40 | 使用快捷键Ctrl+Shift+X调出扩展面板,输入Go for Visual Studio Code,安装Go语言插件。 41 | 42 |
43 | 44 | 45 | ![Go for Visual Studio Code](./pic/auto/image082.jpg) 46 | 47 | 5-01_03 Go for Visual Studio Code下载 48 |
49 | 50 | **3. 配置环境变量** 51 | 52 | 使用快捷键Ctrl+Shift+P调出命令面板,输入Go:Current GOPATH,可以查看当前Go的GOPATH环境变量。 53 | 54 | 当然也可以在File->Preferences->Settings->User->Extensions->Go菜单中设置Gopath。 55 | 56 | 选择编辑settings.json可以对环境变化进行设置。 57 | 58 |
59 | 60 | 61 | ![配置环境变量](./pic/auto/image083.jpg) 62 | 63 | 5-01_03 配置环境变量 64 | 65 | ![配置环境变量](./pic/auto/image084.jpg) 66 | 67 | 5-01_04 配置环境变量 68 |
69 | 70 | **4. 配置chaincode依赖包** 71 | 72 | 为了方便进行Chaincode开发,我们需要的安装两个依赖包,分别是: 73 | "github.com/hyperledger/fabric/core/chaincode/shim" 74 | "github.com/hyperledger/fabric/protos/peer" 75 | 76 | Shim包为chaincode(链码)访问状态数据库、交易上下文和调用其他chaincode提供API。 77 | 通过以下命令安装两个依赖包,成功后这些库会被安装在GOPATH路径下。 78 | 79 | ``` 80 | go get github.com/hyperledger/fabric/protos/peer 81 | go get github.com/hyperledger/fabric/core/chaincode/shim 82 | ``` 83 | 84 | 当然你也可以使用Fabric源码,其中包含了以上两个依赖包。下载到$GOPATH/src/github.com/hyperledger目录下,本地开发的chaincode就可以正常工作了。 85 | 86 | **5. 测试开发环境** 87 | 88 | 在GOPATH下新建一个chaincode(直接拷贝一个Fabric例子程序),执行以下命令: 89 | 90 | ``` 91 | go build 92 | ``` 93 |
94 | 95 | 96 | ![编译链码](./pic/auto/image085.jpg) 97 | 98 | 5-01_05 编译链码 99 |
100 | 101 | 如果编译没有问题就代表环境安装成功。 102 | -------------------------------------------------------------------------------- /chapter5_02_part1 golang_core.md: -------------------------------------------------------------------------------- 1 | ## Golang核心知识 2 | 3 | 这部分内容是写给没有go语言开发经验的读者。如果你对go语言开发非常熟悉,可以直接进入下一节学习链码的基本概念。 4 | 5 | 所有的开发语言都是由数据类型、逻辑结构、函数等组成,如果是面向对象的语言还会涉及到类、接口。这就如同不同国家的语言一样,不同开发语言的语法也有所差异,当然也自己的一些特性。比如Go语言在并发处理上有比较优异的表现;Python有简单易学的特点,特别适用于机器学习。 6 | 7 | Go是面向对象语言,也不是面向对象语言(Yes and No)——这是官方的说法。Go可以进行面向对象编程,却没有对象和继承。如果你熟悉Java、C++的面向对象设计风格,刚开始学习Go语言的时候会比较别扭。Go没有对象类型,但可以通过struct类定义对象;Go没有类,但可以通过数据类型定义方法;Go的Interface也和Java语言不一样,采用的是隐式继承。 8 | 9 | 一开始我们会对Go的这种设计有点不习惯,但时间长了你就会慢慢体会到Go这种没有对象和继承的面向对象编程带来的优势。 10 | 11 | 欢迎学习 “新的面向对象编程语言”——Go。 12 | 13 | **注意:为了保证学习效果,建议大家花上一天时间对下面例子程序进行运行测试,这样学习效果最佳。** 14 | 15 | 16 | -------------------------------------------------------------------------------- /chapter5_02_part3 golang_core.md: -------------------------------------------------------------------------------- 1 | ### 函数 2 | **1.函数(Fucnciton)** 3 | 4 | Go函数是一段用来执行特定任务的代码块,语法如下: 5 | 以func开始,可以有多个参数,返回值位于参数之后。 6 | 7 | ``` 8 | func functionname(parametername type) returntype { 9 | //function body 10 | } 11 | ``` 12 | 返回值和参数在函数中是可选的。下面的语法也是正确的。 13 | ``` 14 | func functionname() { 15 | } 16 | ``` 17 | 以下是一个完整的函数: 18 | ``` 19 | package main 20 | 21 | import ( 22 | "fmt" 23 | ) 24 | 25 | func calculateBill(price, no int) int { 26 | var totalPrice = price * no 27 | return totalPrice 28 | } 29 | func main() { 30 | price, no := 90, 6 31 | totalPrice := calculateBill(price, no) 32 | fmt.Println("Total price is", totalPrice) 33 | } 34 | ``` 35 | **2.多个返回值** 36 | 37 | 与Java等语言不一样的是Go函数可以有多个返回结果。 38 | ``` 39 | package main 40 | 41 | import ( 42 | "fmt" 43 | ) 44 | 45 | func rectProps(length, width float64)(float64, float64) { 46 | var area = length * width 47 | var perimeter = (length + width) * 2 48 | return area, perimeter 49 | } 50 | 51 | func main() { 52 | area, perimeter := rectProps(10.8, 5.6) 53 | fmt.Printf("Area %f Perimeter %f", area, perimeter) 54 | } 55 | ``` 56 | **3.空格标识符** 57 | ``` 58 | package main 59 | 60 | import ( 61 | "fmt" 62 | ) 63 | 64 | func rectProps(length, width float64) (float64, float64) { 65 | var area = length * width 66 | var perimeter = (length + width) * 2 67 | return area, perimeter 68 | } 69 | func main() { 70 | area, _ := rectProps(10.8, 5.6) // perimeter is discarded 71 | fmt.Printf("Area %f ", area) 72 | } 73 | 74 | ``` 75 | 从下图可以看出,使用_空白标识符可以放弃接收第二个返回值。 76 |
77 | 78 | 79 | ![空白标识符](./pic/auto/image087.jpg) 80 | 81 | 5-02_02 空白标识符 82 |
83 | 84 | ### 流程控制(Flow control) 85 | 86 | **1.For** 87 | 88 | Go只有一个循环结构——for。 89 | 与Java等语言不一样的是for的声明语句不需要小括号()。 90 | ``` 91 | for i := 1; i <= 100; i++ { 92 | sum += i 93 | } 94 | ``` 95 | 初始化和递增声明是可选的。 96 | ``` 97 | for ; sum < 1000; { 98 | sum += sum 99 | } 100 | ``` 101 | For语句还可以类似Java里while。 102 | ``` 103 | sum := 1 104 | for sum < 1000 { 105 | sum += sum 106 | } 107 | ``` 108 | **2.If** 109 | Go的if声明语句类似循环语句,表达式不需要使用小括号(),但是执行语句中的大括号{}是需要的。 110 | 111 | ``` 112 | if x < 0 { 113 | return sqrt(-x) + "i" 114 | } 115 | ``` 116 | 117 | **3.Break** 118 | 结束循环。 119 | ``` 120 | package main 121 | 122 | import ( 123 | "fmt" 124 | ) 125 | 126 | func main() { 127 | for i := 0; i < 3; i++ { 128 | for j := 1; j < 4; j++ { 129 | fmt.Printf("i = %d , j = %d\n", i, j) 130 | if i == j { 131 | break 132 | } 133 | } 134 | 135 | } 136 | } 137 | ``` 138 | 139 | **4.Continue** 140 | 141 | 跳过当前语句,继续执行循环语句。 142 | ``` 143 | package main 144 | 145 | import ( 146 | "fmt" 147 | ) 148 | 149 | func main() { 150 | for i := 1; i <= 10; i++ { 151 | if i%2 == 0 { 152 | continue 153 | } 154 | fmt.Printf("%d ", i) 155 | } 156 | } 157 | ``` 158 | 159 | **5.标签** 160 | 161 | break使用标签(labels),跳出当前标签循环。 162 | ``` 163 | package main 164 | 165 | import ( 166 | "fmt" 167 | ) 168 | 169 | func main() { 170 | outer: 171 | for i := 0; i < 3; i++ { 172 | for j := 1; j < 4; j++ { 173 | fmt.Printf("i = %d , j = %d\n", i, j) 174 | if i == j { 175 | break outer 176 | } 177 | } 178 | 179 | } 180 | } 181 | ``` 182 | 运行效果如下图,可以看出break只是跳出当前循环,但使用break加outer标签直接可以退出标签所在循环,实在是很方便。 183 | 184 |
185 | 186 | 187 | ![标签](./pic/auto/image088.jpg) 188 | 189 | 5-02_03 标签 190 |
191 | 192 | ### 方法(Method) 193 | 194 | Go没有类,然而我们可以为任意数据类型定义方法。 195 | 196 | 为数据类型定义方法(Method)的方式是在func和方法之间增加一个特别的接受参数。 197 | 198 | 下面的例子中,Abs方法有一个Vertex类型的接受参数ver。 199 | 200 | ``` 201 | package main 202 | 203 | import ( 204 | "fmt" 205 | "math" 206 | ) 207 | 208 | type Vertex struct { 209 | X, Y float64 210 | } 211 | 212 | //在func和Abs()方法之间有一个Vertex类型的接受参数ver 213 | func (ver Vertex) Abs() float64 { 214 | return math.Sqrt(ver.X*ver.X + ver.Y*ver.Y) 215 | } 216 | //在func和Add()方法之间有一个Vertex类型的接受参数ver 217 | func (ver Vertex) Add() float64{ 218 | return ver.X+ver.Y 219 | } 220 | //在func和Divide ()方法之间有一个Vertex类型的接受参数ver 221 | func (ver Vertex) Divide() float64{ 222 | return ver.X/ver.Y 223 | } 224 | 225 | func main() { 226 | ver := Vertex{3, 4} 227 | fmt.Println(ver.Abs()) 228 | fmt.Println(ver.Add()) 229 | fmt.Println(ver.Divide()) 230 | } 231 | ``` -------------------------------------------------------------------------------- /chapter5_02_part4 golang_core.md: -------------------------------------------------------------------------------- 1 | ### 指针接收器(Pointer receivers) 2 | 上面例子定义方法的时候我们使用的是值接收器( value receiver)。下面我学习一下使用指针接收器( pointer receiver)定义方法,并琢磨一下两者之间有什么区别。 3 | 4 | 下面的例子使用了指针接收器( pointer receiver)定义方法。在定义Vertex 的Scale()方法时,传递了一个指针接收器*Vertex。 5 | 6 | ``` 7 | package main 8 | 9 | import ( 10 | "fmt" 11 | "math" 12 | ) 13 | 14 | type Vertex struct { 15 | X, Y float64 16 | } 17 | //传递了值接收器Vertex 18 | func (v Vertex) Abs() float64 { 19 | return math.Sqrt(v.X*v.X + v.Y*v.Y) 20 | } 21 | //传递了指针接收器*Vertex 22 | func (v *Vertex) Scale(f float64) { 23 | v.X = v.X * f 24 | v.Y = v.Y * f 25 | } 26 | 27 | func main() { 28 | v := Vertex{3, 4} 29 | //在调用指针接收器方法时使用了v,而没有采用&v 30 | //这是因为在使用指针接收器作为参数时,go语言会默认会将 31 | //v.Scale(10)看做&v.Scale(10) 32 | v.Scale(10) 33 | fmt.Println(v.Abs()) 34 | } 35 | ``` 36 | 接下来我们把Scale()方法的指针接收器*Vertex修改为值接收器Vertex,看看与指针接收器有什么差别。 37 | 38 |
39 | 40 | 41 | ![值接收器与指针接收器的差别](./pic/auto/image089.jpg) 42 | 43 | 5-02_04 值接收器与指针接收器的差别 44 |
45 | 46 | 从上图中我可以看出,使用指针接收器调用Scale()方法时,指针接收器修改了Vertex的值,使得Vertex在调用Abs()方法时X、Y都增加了10倍,因此调用Abs()方法得到的结果是50。 47 | 48 | 接下来,采用了值接收器后,Vertex同样还是调用了Scale()方法,但是只是对Vertex的拷贝进行操作,因此调用Abs()方法时结果还是Vertex初始值运算结果5。 49 | 50 | **注意:在定义方法时,虽然v.Scale(10)的v传递的值,而非指针,但Go解释器会自动将v.Scale(10)看做&v.Scale(10)。** 51 | 52 | 下面是采用函数的方式实现以上功能。看看函数与指针接收器的方法有啥区别。 53 | 54 | ``` 55 | package main 56 | 57 | import ( 58 | "fmt" 59 | "math" 60 | ) 61 | 62 | type Vertex struct { 63 | X, Y float64 64 | } 65 | 66 | func Abs(v Vertex) float64 { 67 | return math.Sqrt(v.X*v.X + v.Y*v.Y) 68 | } 69 | 70 | func Scale(v *Vertex, f float64) { 71 | v.X = v.X * f 72 | v.Y = v.Y * f 73 | } 74 | 75 | func main() { 76 | v := Vertex{3, 4} 77 | //函数调用时,传递的参数必须与函数定义的类型一致 78 | Scale(&v, 10) 79 | fmt.Println(Abs(v)) 80 | } 81 | ``` 82 | 采用函数的方式实现上面的功能,传递的参数就必须与函数定义的类型一致,否则会出现下图中的编译错误。 83 | 84 |
85 | 86 | 87 | ![函数的实现方式](./pic/auto/image090.jpg) 88 | 89 | 5-02_05 函数的实现方式 90 |
91 | 92 | ### 接口(Interface) 93 | 94 | 在面向对象语言中,接口定义了对象的行为。换句话来说,接口只是定义了对象打算做的事情,但没有具体的实现。 95 | 96 | 在Go语言中,接口是一套空方法。当一个数据类型提供了接口中定义的所有方法,也就意味着该数据类型实现了接口。这种方式类似于面向对象中的设计,但没有implements关键字,也就是常说的“隐式继承”。Go的设计解耦了接口定义和具体实现,相比Java的强耦合继承关系,更加容易使用且通用性强。 97 | 98 | ``` 99 | package main 100 | 101 | import "fmt" 102 | 103 | type I interface { 104 | M() 105 | } 106 | 107 | type T struct { 108 | S string 109 | } 110 | 111 | type MyFloat float64 112 | 113 | // 这个方法说明type T实现了接口I, 114 | // 但是我们不需要显式声明 115 | func (t T) M() { 116 | fmt.Println(t.S) 117 | } 118 | // 这个方法说明float64 MyFloat实现了接口I, 119 | // 但是我们不需要显式声明 120 | 121 | func (f MyFloat) M() { 122 | fmt.Println(f) 123 | } 124 | 125 | func main() { 126 | var i I = T{"hello"} 127 | i.M() 128 | 129 | var f I = MyFloat(2) 130 | f.M() 131 | } 132 | ``` 133 | 以下是Java的接口实现方式,类必须使用implements关键字进行接口实现,而且类与接口之间是强耦合。 134 | 135 | ``` 136 | import java.io.IOException; 137 | interface Shape { 138 | void draw(double amount) throws IOException; 139 | } 140 | class Main implements Shape{ 141 | 142 | @Override 143 | public void draw(double amount) { 144 | // TODO Auto-generated method stub 145 | } 146 | } 147 | ``` 148 | 149 | 150 | -------------------------------------------------------------------------------- /chapter5_03 chaincode_concept.md: -------------------------------------------------------------------------------- 1 | ## 链码基本概念 2 | 3 | 智能合约(smart contract)本质上是一段运行在区块链网络上的业务逻辑代码。 4 | 5 | 绝大多数的区块链都要求采用共识机制验证、排序并将交易广播到所有节点,然后每个节点按照顺序执行交易。 6 | 7 | 运行在区块链上智能合约必须是一些确定性的业务逻辑。如果运行一些随机性较强的业务,由于每个节点的运行结果不一致,这样就无法达成共识。进一步来讲,由于智能合约运行在每个节点上,每个节点要按顺序执行交易,整个网络要对交易进行并行计算,这就牺牲了程序的效率,但同时可保证代码的安全性。 8 | 9 | Fabric在设计上解耦了排序节点(Orderer)、背书节点( Endorser )、确认节点( Committer ),并将交易流程分为背书节点进行交易验证及模拟执行,Orderer节点进行交易排序并生成区块,以及Commiter节点验证交易并将区块写入账本,解决了传统区块链面临的扩展性、灵活性、性能及机密性挑战问题。 10 | 11 | 在Fabric中,可以根据业务需要进行背书策略设置,选择采用哪些节点进行智能合约的执行。这样做的好处是,交易只需要执行在背书策略设定的节点上,这样就允许并行执行提高网络的整体性能。同时这种方式也可以在排序之前过滤掉不确定业务逻辑,消除了合约不确定性。 12 | 13 | 以太坊虚拟机(EVM)是以太坊智能合约的运行环境。它不仅被沙盒封装起来,事实上它被完全隔离,也就是说运行在EVM内部的代码不能接触到网络、文件系统或者其它进程,甚至智能合约之间也只有有限的调用。EOS虚拟机采用的WebAssembly(WASM)是一个内存安全的沙盒执行环境虚拟机,为智能合约提供了安全保障。Fabric使用了Docker来存放链上的代码,而不需要依靠特定的虚拟机,Docker为链码执行提供了一个安全、轻便的语言执行环境。 14 | 15 | ### 智能合约与Chaincode 16 | 17 | 从应用开发者视角来看,智能合约(Smart Contract)经常与账本(Ledger)联系在一起,账本保存了业务对象当前状态和历史状态。 18 | 19 | 在Fabric中经常会用到智能合约和链码两个术语。智能合约定义了业务资产和不同组织的业务逻辑,是区块链应用的核心业务逻辑。与智能合约对应的是链码,一个链码里可以包含多个智能合约。智能合约负责业务逻辑,而链码负责的是怎样将智能合约进行打包、部署。 20 | 21 | 通常情况下,系统管理员关注的是链码,业务人员和开发人员关注的是智能合约。 22 | 23 | 举个车辆买卖的例子。在车辆买卖业务中,假设有销售方和购买方两个组织,使用智能合约实现车辆销售的业务逻辑。一旦销售方将车辆按照指定时间交付,购买方就根据之前车辆购买合同中的约定自动进行付款,通过智能合约可以大幅度提高业务执行效率。 24 | 25 |
26 | 27 | 28 | ![智能合约](./pic/auto/image091.jpg) 29 | 30 | 5-03_01 智能合约 31 |
32 | 33 | 上图中定义了车辆的智能合约。智能合约中定义了车辆资产(Car结构体)和销售方和购买方的相关业务逻辑(queryCar、createCar和changeCar等相关方法)。当应用调用Invoke方法时就会执行相应业务逻辑,进而生成交易数据存储在账本里。 34 | 35 | ### 链码的生命周期 36 | 37 | 链码(chaincode)使用gRPC协议通过Peer节点操作分布式账本中的数据。Fabric网络启动后,可以通过命令行或SDK进行链码操作,验证网络是否正常运行。 38 | 39 | 用户可以通过命令行方式操作链码,支持的链码子命令包括install 、instantiate 、invoke 、query、upgrade 、package 和signpackage 等,大部分命令(除了package 、signpackage)的处理过程都是类似的,先创建签名提案消息,再发给Peer 进行背书,获取ProposalResponse 消息。 40 | 41 | 需要注意的是, instantiate 、upgrade 和invoke 等子命令还需要根据ProposalResponse 消息创建SignedTX , 发送给Orderer 进行排序和广播全网执行。package、signpackage 子命令作为本地操作,无需与Peer 或Orderer 打交道。 42 | 43 | 链码生命周期,包括初始状态,等待安装、等待实例化、运行和停止。 44 | 45 |
46 | 47 | 48 | ![链码生命周期](./pic/auto/image092.jpg) 49 | 50 | 5-03_02 链码生命周期 51 |
52 | 53 | **peer chaincode install** 54 | 55 | 将链码打包成可部署格式,并存入到背书节点的文件系统。 56 | 57 | **peer chaincode instantiate** 58 | 59 | 把安装到背书节点上的链码实例化到指定通道,该命令会在节点上创建运行链码的docker容器,并初始化链码。 60 | 61 | **peer chaincode invoke** 62 | 63 | 调用指定链码。 64 | 65 | **peer chaincode query** 66 | 67 | 查询指定链码,该命令只查询节点上状态,不生成区块。 68 | 69 | **peer chaincode package** 70 | 71 | 将链码打包为可部署格式 72 | 73 | **peer chaincode signpackage** 74 | 75 | 签名打包后的链码 76 | 77 | **peer chaincode upgrade** 78 | 79 | 升级链码,需要先用peer chaincode install命令安装更新代码,然后使用该命令来升级已经实例化的代码。 80 | 81 | -------------------------------------------------------------------------------- /chapter5_05 chaincode_unit_test.md: -------------------------------------------------------------------------------- 1 | ## 单元测试 2 | 3 | Go语言提供了MockStub类型用于单元测试,可以使用“go test”命令,或者通过VS code进行单元测试。 4 | 5 | 单元测试的好处是不用启动Fabric网络即可在本地开发环境下进行链码的测试。 6 | 7 | 其原理是维护了一个 map[string][]byte类型的State用来模拟账本状态数据库,对链码的操作PutState()、GetState()、DelState()方法都是针对与内存中的State。MockStub主要提供了MockInit()、MockInvoke()方法模拟背书节点对链码的调用。 8 | 9 | 编写测试用例时,文件必须以_test.go结尾,包含TestXxx函数(Xxx首字母必须是大写),并与链码位于同一包路径下。编写链码测试用例可以直接参考官方提供的例子程序:github.com\hyperledger\fabric\examples\chaincode\go\example02\chaincode_test.go 10 | 11 | 为了方便测试用例编写,这里提供了一些常用的测试方法: 12 | 13 | * checkInit 14 | * checkState 15 | * checkQuery 16 | * checkInvoke 17 | 18 | sacc_test.go测试用例如下: 19 | 20 | ``` 21 | package main 22 | 23 | import ( 24 | "fmt" 25 | "testing" 26 | 27 | "github.com/hyperledger/fabric/core/chaincode/shim" 28 | ) 29 | 30 | func checkInit(t *testing.T, stub *shim.MockStub, args [][]byte) { 31 | res := stub.MockInit("1", args) 32 | if res.Status != shim.OK { 33 | fmt.Println("Init failed", string(res.Message)) 34 | t.FailNow() 35 | } 36 | } 37 | 38 | func checkState(t *testing.T, stub *shim.MockStub, name string, value string) { 39 | bytes := stub.State[name] 40 | if bytes == nil { 41 | fmt.Println("State", name, "failed to get value") 42 | t.FailNow() 43 | } 44 | if string(bytes) != value { 45 | fmt.Println("State value", name, "was not", value, "as expected") 46 | t.FailNow() 47 | } 48 | } 49 | 50 | func checkQuery(t *testing.T, stub *shim.MockStub, name string, value string) { 51 | res := stub.MockInvoke("1", [][]byte{[]byte("query"), []byte(name)}) 52 | if res.Status != shim.OK { 53 | fmt.Println("Query", name, "failed", string(res.Message)) 54 | t.FailNow() 55 | } 56 | if res.Payload == nil { 57 | fmt.Println("Query", name, "failed to get value") 58 | t.FailNow() 59 | } 60 | if string(res.Payload) != value { 61 | fmt.Println("Query value", name, "was not", value, "as expected") 62 | t.FailNow() 63 | } 64 | } 65 | 66 | func checkInvoke(t *testing.T, stub *shim.MockStub, args [][]byte) { 67 | res := stub.MockInvoke("1", args) 68 | if res.Status != shim.OK { 69 | fmt.Println("Invoke", args, "failed", string(res.Message)) 70 | t.FailNow() 71 | } 72 | } 73 | 74 | func TestSacc_Init(t *testing.T) { 75 | cc := new(SimpleAsset) 76 | stub := shim.NewMockStub("sacc", cc) 77 | 78 | // Init a=100 79 | checkInit(t, stub, [][]byte{[]byte("a"), []byte("100")}) 80 | // check a=100 81 | checkState(t, stub, "a", "100") 82 | 83 | } 84 | 85 | func TestSacc_Query(t *testing.T) { 86 | cc := new(SimpleAsset) 87 | stub := shim.NewMockStub("sacc", cc) 88 | 89 | // Init a=100 90 | checkInit(t, stub, [][]byte{[]byte("a"), []byte("100")}) 91 | // Init b=100 92 | checkInit(t, stub, [][]byte{[]byte("b"), []byte("100")}) 93 | // check a=100 94 | checkQuery(t, stub, "a", "100") 95 | // check b=100 96 | checkQuery(t, stub, "b", "100") 97 | 98 | } 99 | 100 | func TestSacc_Invoke(t *testing.T) { 101 | cc := new(SimpleAsset) 102 | stub := shim.NewMockStub("sacc", cc) 103 | 104 | // Init a=100 105 | checkInit(t, stub, [][]byte{[]byte("a"), []byte("100")}) 106 | // Init b=100 107 | checkInit(t, stub, [][]byte{[]byte("b"), []byte("100")}) 108 | 109 | checkQuery(t, stub, "a", "100") 110 | checkQuery(t, stub, "b", "100") 111 | 112 | // set a=10 113 | checkInvoke(t, stub, [][]byte{[]byte("set"), []byte("a"), []byte("10")}) 114 | // set b=90 115 | checkInvoke(t, stub, [][]byte{[]byte("set"), []byte("b"), []byte("90")}) 116 | 117 | checkQuery(t, stub, "a", "10") 118 | checkQuery(t, stub, "b", "90") 119 | } 120 | ``` 121 | 在命令行执行go test,结果如下: 122 | 123 |
124 | 125 | 126 | ![单元测试](./pic/auto/image094.jpg) 127 | 128 | 5-05 单元测试 129 |
130 | 131 | VS code提供run package tests、 run file tests 、run test、 debug test方式进行单元测试。 132 | 133 | **注意:完成链码单元测试后,我们还可以在Fabric的开发环境进行进一步测试。Fabric的开发环境位于fabric-samples目录下的chaincode-docker-devmode下。** 134 | 135 | 具体测试步骤可以参照官方文档说明: 136 | 137 | https://hyperledger-fabric.readthedocs.io/en/release-1.4/chaincode4ade.html#testing-using-dev-mode 138 | 139 | 140 | -------------------------------------------------------------------------------- /chapter5_06 summary.md: -------------------------------------------------------------------------------- 1 | ## 智能合约开发知识总结 2 | 3 | 通过本章节的学习,我么已经掌握了开发环境搭建、Golang核心知识、链码基本概念、链码开发、单元测试,相信你已经掌握了链码开发这项技能。但是我在这里还要提醒大家,千万不要忘了日常练习,直至将这项技能完全掌握。 4 | 5 | 学会了智能合约开发,下一章我们以区块链溯源为案例详细介绍一个完整区块链项目的实施。 6 | 7 | 祝大家学习快乐! -------------------------------------------------------------------------------- /chapter6_00.md: -------------------------------------------------------------------------------- 1 | # 区块链溯源案例分析 2 | 3 | 区块链溯源被认为是继区块链金融之后最具潜力的区块链应用。 4 | 5 | 区块链去中心化、不可篡改、可追溯的特点与溯源业务是绝对的天仙配。 6 | 7 | 本章以农产品溯源案例为背景,从需求分析、系统设计、智能合约及应用开发详细介绍一个完整的区块链项目开发过程。 8 | 9 | 如果说之前的学习目标是为了把大家打造成一位侠客——拥有丰富的理论和极强的动手能力,那么这一章的目标是带领大家成为一名区块链世界里的帅才——拥有方案、需求、设计、开发、运维等技能。 10 | 11 | 本章主要内容: 12 | * [区块链农产品溯源方案设计](./chapter6_01%20solution.md) 13 | * [需求分析](./chapter6_02%20requirement.md) 14 | * [数据资产及业务流程设计](./chapter6_03%20asset_business_design.md) 15 | * [智能合约设计开发](./chapter6_04%20smartcontract_dev.md) 16 | * [Fabric SDK](./chapter6_05%20fabric_sdk.md) 17 | * [区块链应用开发](./chapter6_06%20blockchain_application_dev.md) 18 | * [区块链溯源案例分析知识总结](./chapter6_07%20summary.md) -------------------------------------------------------------------------------- /chapter6_01 solution.md: -------------------------------------------------------------------------------- 1 | ## 区块链农产品溯源方案设计 2 | ### 项目背景 3 | 农产品质量安全就是指农产品的可靠性、使用性和内在价值,包括在生产、贮存、流通和使用过程中形成、残存的营养、危害及外在特征因子,既有等级、规格、品质等特性要求,也有对人、环境的危害等级水平的要求。 4 | 5 | 农产品的质量安全问题一直是消费者、政府及社会各界关注的重点。2006年4月我国颁布了《中华人民共和国农产品质量安全法》,从我国农业生产的实际出发,针对保障农产品质量安全,规定了管理体制、质量安全要求、强制实施制度以及农产品产地、农产品生产、农产品包装和标识、监督检查及责任追究制度。 6 | 7 | 2019年中央一号文件连续第16年聚焦“三农”,提出完成高标准农田建设任务,调整优化农业结构,实施重要农产品保障战略。将稻谷、小麦作为必保品种,稳定玉米生产,确保谷物基本自给、口粮绝对安全。巩固棉花、油料、糖料、天然橡胶生产能力。主动扩大国内紧缺农产品进口,拓展多元化进口渠道。加大农产品反走私综合治理力度。完善农业支持保护制度。 8 | 9 | 2019年2月农业农村部办公厅印发了《2019年农产品质量安全工作要点》,文件指出:2019年是新中国成立70周年,是全面建成小康社会关键之年,做好农产品质量安全工作意义重大。各级农业农村部门要坚决贯彻落实习近平总书记“四个最严”指示要求,坚持以实施乡村振兴战略为总抓手,以深化农业供给侧结构性改革为主线,以增加绿色优质农产品供给为主攻方向,坚持“产出来”“管出来”两手抓,进一步推进质量兴农、绿色兴农、品牌强农,提升农产品质量安全水平,切实保障人民群众“舌尖上的安全”。 10 | 11 | ### 项目概述 12 | 中共中央政治局第十八次集体学习时提出: 13 | >要探索“区块链+”在民生领域的运用,积极推动区块链技术在教育、就业、养老、精准脱贫、医疗健康、商品防伪、食品安全、公益、社会救助等领域的应用,为人民群众提供更加智能、更加便捷、更加优质的公共服务。” 14 | 15 | 区块链溯源被认为是继区块链金融之后最具潜力的区块链应用。区块链去中心化、不可篡改、可追溯的特点与溯源业务是绝对的天仙配。 16 | 17 | 传统溯源主要存在以下两个问题: 18 | 1. 数据中心化存储,由于各方利益考虑存在篡改数据的风险; 19 | 2. 溯源系统上企业各自记账,形成信息孤岛,数据无法溯源。 20 | 21 | 区块链溯源可以有效解决上面两个问题: 22 | 1. 基于区块链的哈希算法、共识机制,一旦数据上链,无法篡改; 23 | 2. 在不改变数据所有权的情况下,可以提高各方利益共享数据的积极性。 24 | 25 | 区块链技术拥有去中心化、数据不可篡改、可追溯等特性,成为继二维码、条形码等溯源技术的又一新的解决方案。 26 | 27 | 将区块链技术和物联网、二维码等技术相结合,将商品信息、物流信息、销售信息记录在链上,帮助企业有效解决商品溯源、防窜货等问题,制定精准的营销策略。 28 | 29 |
30 | 31 | 32 | ![区块链溯源](./pic/auto/image111.jpg) 33 | 34 | 6-01-01 区块链溯源 35 |
36 | 37 | 区块链溯源上链信息的质量是关键。将商品信息、物流数据、销售信息记录在链上,区块链数据不可篡改的特点,可以有效保证上链的商品信息无法篡改,使得商品溯源的信任程度大幅度提升。 38 |
39 | 40 | 41 | ![区块链溯源](./pic/auto/image112.jpg) 42 | 43 | 6-01-02 区块链溯源 44 |
45 | 46 | ### 项目目标 47 | 通过信息化手段提升农产品质量监管与服务水平,实现农产品质量管理“生产过程可记录、产品流向可跟踪、储运信息可查询、质量问题可追溯”的目标,集“管、防、控”功能于一体,确保“舌尖上的安全”,让社会群众买的放心、吃得安心。同时提升农业和农产品整体品牌形象,帮助企业打造强势品牌实现优质优价,促进地方农业发展,提升农业企业、合作社、农民的经济效益。 48 | 49 | 以二维码为产品溯源标识,利用区块链技术,通过其独特的不可篡改的分布式账本记录特性,对农产品生产到消费者进行全程可追溯,利用时间戳、共识机制等技术手段实现了数据的不可篡改和追本溯源等功能,给政府部门、农业企业、流通机构、服务机构的跨机构的溯源体系建立提供了技术支撑。同时把检测机构与消费者纳⼊监督体系中,打破了信息孤岛,提供了信息支持,在一定程度上实现农产品信息流转的透明度。 50 | 51 | ### 总体架构 52 | 技术上,农产品溯源会采用联盟链。在架构设计上,采用了可插拔、可扩展的系统框架;在节点的接入上,采用了授权管理的方式;在隐私保护上,采用了完备的权限和审查管理、细粒度隐私保护机制。由于农产品溯源链在设计上很好的使用了区块链分布式账本的特点和优势,因此农产品溯源在设计上体现了区块链多中心、公开透明、不可篡改、可追溯的特点,同时交易速度更快,具有更高的扩展性,并能很好的保护交易的隐私性。 53 | 54 |
55 | 56 | 57 | ![总体架构](./pic/auto/image113.png) 58 | 59 | 6-01-03 总体架构 60 |
61 | 62 | 从技术角度来看,农产品溯源链是由资源层、服务层、应用层、展现层四部分组成。 63 | 64 | 资源层是是区块链系统正常运行所需的软硬件环境。 65 | 66 | 服务层包含区块链的底层协议和扩展服务。底层协议包含共识机制、账本以及网络,扩展服务包含了身份识别服务、区块链服务、智能合约及应用编程接口。 67 | 68 | 应用层是基于区块链技术开发的农产品溯源应用。农产品溯源应用系统可将农产品生产、加工、销售等过程的各种相关信息进行记录并存储在区块链上,能通过食品识别号在网络上对该产品进行查询认证,追溯其在各环节中的相关信息。 69 | 70 | 一个完整的区块链应用包含智能合约和WEB、APP系统,WEB、APP系统通过SDK与区块链进行交互。 71 | 72 | ### 效益与意义 73 | 农产品质量安全监管与溯源平台的建设,对于政府部门、农业企业、社会公众均有重要意义。 74 | 75 | 对于政府部门,溯源平台是提高农产品质量安全管理水平的重要抓手,促使农业生产规范化、标准化,打造区域农业品牌,面向社会提供了统一防伪溯源查验入口,并创新溯源产品保险承保机制,降低政府部门市场监管风险的同时,提升消费者对产品的认可度和认知度,提高政府的社会公信力。 76 | 77 | 对于农业企业,农产品溯源机制将倒逼企业加强食品安全生产管理,这是降低企业经营风险的根本保障,并有助于企业创建农产品品牌,让优质产品实现优价。溯源与保险的结合将提高企业对食品危机的风控水平。同时借助溯源平台对电子商务、实体门店信息、活动推广等资源整合,拉动产品市场销量。溯源平台云集众多优质企业,为跨业联盟与强强联合提供便利条件。 78 | 79 | 对于社会公众,全品类溯源监管体系的延伸将惠及全民,解决农业生产端与消费终端不对称的问题,溯源平台建设有效避免假冒伪劣商品进入正规渠道,消费者购买产品时可通过具有公信力的溯源服务平台进行查询,对出现问题的产品进行维权,合法权益将受到更好的保护。 80 | 81 | ### 行业案例 82 | IBM、阿里、百度、京东、腾讯等国内外众多科技巨头都纷纷在区块链溯源方面积极布局跟进。 83 | 84 | 沃尔玛跟IBM合作,将食品供应链上的所有利益相关者组织起来协作,以期望达到食品安全的可追溯性,最重要的是向消费者展示全流程的透明度。 85 | 86 | 备受假货困扰的阿里巴巴,得益于集团多年的业务基础和数据积淀,商品溯源成为蚂蚁区块链最具优势的项目。 87 | 88 | 2017年3月,阿里与普华永道、新西兰邮政、恒天然合作,签署了全球跨境食品溯源的互信框架合作协议,应用“区块链”等创新技术,推动透明可追溯的跨境食品供应链。 89 | 90 | 2017年5 月,天猫国际启动全球溯源计划——利用区块链技术以及大数据跟踪进口商品全链路,在这个场景中,天猫针对来自澳洲、新西兰26个品牌商家、奶制品,基于蚂蚁区块链提供了关于每一瓶奶制品的身份证的溯源码服务。 91 | 92 | 2017年8月,天猫国际就已经全面启动全球溯源计划,利用区块链技术及大数据跟踪进口商品信息。 93 | 94 | 2018年2月,菜鸟和天猫国际达成合作,启用区块链技术建立商品的全链路物流信息。 95 | 需要注意的是,虽然区块链溯源有很多优势,但从实际业务来看,需要制定行业标准,对供应链系统进行改造,借助物联网技术进行数据采集避免源头造假。 96 | -------------------------------------------------------------------------------- /chapter6_02 requirement.md: -------------------------------------------------------------------------------- 1 | 在全球范围内,每年在海洋沿海资源和工业上花费3万亿美元。从捕鱼,加工,运输到销售,海洋渔业雇用了超过2亿人。我们多达40%的海洋受到非法捕鱼等人类活动的严重影响。这是一个巨大的行业,可以在提高行业透明度方面进行创新。 2 | 3 | 这里我们使用Hyperledger Fabric 将区块链技术应用到鱼类溯源案例中。 4 | 5 | 鱼类溯源环节涉及从捕捞、运输到餐厅。这个过程中涉及源头渔夫、餐厅以及监管机构,监管机构的主要作用是验证数据的有效性和补货数量的可持续性。 6 | 7 | 我们将使用Hyperledger Fabric的框架来跟踪此过程的每个部分。在这个业务场景中有点需要特别注意: 8 | 9 | 1. 网络中有许多参与者,你将看到这些参与者如何相互作用以及如何进行交易。 10 | 11 | 2. Fabric中通道允许私下达成一致交易,同时仍保持透明度,以便其他参与者可以证实并确认他们的交易。 12 | 13 | 采用通道方式监管者和餐馆老板可以通过通道来确认特定鱼类的供应是否可持续和采购是否合法,而无需查看整个运输过程的细节。这个过程只有渔夫和餐馆老板知道具体细节。 14 | -------------------------------------------------------------------------------- /chapter6_03 asset_business_design.md: -------------------------------------------------------------------------------- 1 | ## 数据资产及业务流程设计 2 | 3 | ### 数据资产 4 | 定一个农产品资产,其中包含船只、位置、日期时间和拥有者属性。 5 | * 船只 6 | * 位置 7 | * 日期时间 8 | * 拥有者 9 | 10 | ### 业务流程 11 | 完整的业务流程包含一下三步: 12 | * 渔民捕捞鱼 13 | * 渔民将鱼卖给餐馆 14 | * 监管者通过供应链系统验证和检查合法性和供应的可持续性。 -------------------------------------------------------------------------------- /chapter6_05 fabric_sdk.md: -------------------------------------------------------------------------------- 1 | ## Fabric SDK 2 | 3 | Fabric SDK 封装了一系列与区块链网络打交道的基本方法,包括发送交易、监听网络事件、查询区块和交易信息等。通过SDK 可以很容易地使用以下四个步骤完成一次完整的程序调用和确认。 4 | 5 | * 从CA 获取合法的身份证书; 6 | * 构造合法的交易提案提交给Endorser 节点进行背书; 7 | * 收集到足够多Endorser 支持后,构造合法的交易请求,发给Orderer 节点进行排序; 8 | * 监听事件,确保交易已经写入账本。 9 | 10 | Fabric 目前支持Node.js 、Java的SDK(Python和Go的SDK目前还没有正式发布) 。本教程以Node.js为例。 11 | 12 | 官方文档: 13 | 14 | https://hyperledger.github.io/fabric-sdk-node/release-1.4/index.html 15 | -------------------------------------------------------------------------------- /chapter6_06 blockchain_application_dev.md: -------------------------------------------------------------------------------- 1 | ## 区块链应用开发 2 | 3 | 至此,我们已经完成了溯源业务的智能合约开发,接下来我们将基于Fabric Node.js SDK进行溯源应用的开发。 4 | 5 | 本章节我们会将前面学到理论知识融合到具体应用案例中。一起看看用户怎样通过应用查询、更新账本以实现与Fabric网络的交互。 6 | 7 | 应用程序通过SDK向区块链网络提交交易调用智能合约,背书节点在指定容器中运行智能合约(智能合约执行交易);如果没有问题,应用程序在收到足够背书之后将交易发给Orderer节点;Orderer节点对交易请求进行打包然后广播给网络中其它节点;节点对交易进行最终检查,通过后写入账本。 8 | 9 | ### 系统原型 10 |
11 | 12 | 13 | ![首页](./pic/auto/image117.jpg) 14 | 15 | 6-06-01 首页 16 | 17 | ![查询](./pic/auto/image118.jpg) 18 | 19 | 6-06-02 查询 20 | 21 | ![创建新的货物](./pic/auto/image119.jpg) 22 | 23 | 6-06-03 创建新的货物 24 | 25 | ![创建新的货物](./pic/auto/image120.jpg) 26 | 27 | 6-06-04 修改货物拥有者 28 |
29 | 30 | ### 主要应用程序文件 31 |
32 | 33 | 34 | ![主要应用程序文件](./pic/auto/image121.jpg) 35 | 36 | 6-06-05 主要应用程序文件 37 |
38 | 39 | 完整的应用程序我已经放在了[源码目录](./src/fabric-material)下,下载完成后通过FTP工具上传到之前配置好的Ubuntu系统,执行以下命令: 40 | 41 | **1. 启动网络** 42 | ``` 43 | #进入到程序目录 44 | cd fabric-material/tuna-app 45 | # 启动Fabric网络 46 | ./startFabric.sh 47 | ``` 48 | 49 | **2. 安装Node.js相关依赖文件,按照以下顺序启动应用程序。** 50 | ``` 51 | # 安装node.js依赖文件 52 | $ npm install 53 | # 注册Admin 54 | $ node registerAdmin.js 55 | # 注册用户,用于系统的访问 56 | $ node registerUser.js 57 | # 启动应用程序 58 | $ node server.js 59 | ``` 60 | **3. 通过浏览器访问localhost:8000,即可访问。** 61 | 62 | ![基于区块链的溯源系统](./pic/Hyperledger_fabirc_tuna_application.png) 63 | 64 | 6-06-06 基于区块链的溯源系统 65 | 66 | **注意:如果你的页面显示出现下面的错误,请检查本机(虚拟机)的网络是否可以正常连接Google API。** 67 | 68 | ![image-20201203141839660](C:\Users\Dell\AppData\Roaming\Typora\typora-user-images\image-20201203141839660.png) 69 | 70 | **4. 每次学习完毕,记着通过以下命令清除docker容器和密钥文件。** 71 | 72 | ``` 73 | $ docker rm -f $(docker ps -aq) 74 | 75 | $ cd ~ 76 | $ rm -rf .hfc-key-store/ 77 | ``` 78 | 79 | ### 主要应用逻辑 80 | 81 | 1. 设置Fabric网络 82 | ``` 83 | var Fabric_Client = require('fabric-client'); 84 | var path = require('path'); 85 | var util = require('util'); 86 | var os = require('os'); 87 | 88 | var fabric_client = new Fabric_Client(); 89 | 90 | // setup the fabric network 91 | var channel = fabric_client.newChannel('mychannel'); 92 | var peer = fabric_client.newPeer('grpc://localhost:7051'); 93 | channel.addPeer(peer); 94 | ``` 95 | 2. 获取用户证书 96 | ``` 97 | var member_user = null; 98 | var store_path = path.join(os.homedir(), '.hfc-key-store'); 99 | console.log('Store path:'+store_path); 100 | ``` 101 | 3. 查询所有 102 | ``` 103 | // queryAllTuna - requires no arguments , ex: args: [''], 104 | const request = { 105 | chaincodeId: 'tuna-app', 106 | txId: tx_id, 107 | fcn: 'queryAllTuna', 108 | args: [''] 109 | }; 110 | ``` 111 | 4. 查询 112 | ``` 113 | // queryTuna - requires 1 argument, ex: args: ['4'], 114 | const request = { 115 | chaincodeId: 'tuna-app', 116 | txId: tx_id, 117 | fcn: 'queryTuna', 118 | args: [key] 119 | }; 120 | ``` 121 | 5. 增加 122 | ``` 123 | // recordTuna - requires 5 args, ID, vessel, location, timestamp,holder - ex: args: ['10', 'Hound', '-12.021, 28.012', '1504054225', 'Hansel'], 124 | // send proposal to endorser 125 | const request = { 126 | //targets : --- letting this default to the peers assigned to the channel 127 | chaincodeId: 'tuna-app', 128 | fcn: 'recordTuna', 129 | args: [key, vessel, location, timestamp, holder], 130 | chainId: 'mychannel', 131 | txId: tx_id 132 | }; 133 | ``` 134 | 6. 修改 135 | ``` 136 | // changeTunaHolder - requires 2 args , ex: args: ['1', 'Barry'], 137 | // send proposal to endorser 138 | var request = { 139 | //targets : --- letting this default to the peers assigned to the channel 140 | chaincodeId: 'tuna-app', 141 | fcn: 'changeTunaHolder', 142 | args: [key, holder], 143 | chainId: 'mychannel', 144 | txId: tx_id 145 | }; 146 | ``` 147 | **注意:以上应用程序包含了Fabric测试网络。学员也可以将链码和Node.js程序拷贝到之前我们已经配置好的Fabric网络进行测试。** -------------------------------------------------------------------------------- /chapter6_07 summary.md: -------------------------------------------------------------------------------- 1 | ## 区块链溯源案例分析知识总结 2 | 3 | 本章节通过区块链溯源为案例详细介绍一个完整区块链项目的实施。 4 | 5 | 这个章节是所有章节最难的,因为它需要的技能比较多(方案、需求、设计、开发、运维),学习过程中请大家保持耐心。 6 | 7 | 同时我也会继续完善本章节,请大家持续关注。学习过程中有任何问题可以加我微信253841918. 8 | 9 | 祝大家学习快乐! -------------------------------------------------------------------------------- /chapter7_00.md: -------------------------------------------------------------------------------- 1 | # 区块链即服务 2 | 3 | BaaS(Blockchain as a Service),“区块链即服务”,是指将区块链框架嵌入云计算平台,利用云服务基础设施的部署和管理优势,为开发者提供便捷、高性能的区块链生态环境和生态配套服务,支持开发者的业务拓展及运营支持的区块链开放平台。 4 | 5 | BaaS平台旨在提供创建、管理和维护企业级区块链网络及应用的服务,能够帮助用户降低开发及使用的成本。通过BaaS平台提供的简单易用、成熟可扩展、安全可靠、可视化运维等设计特色,区块链开发者能够满足快速部署、安全可靠的需求,为企业高效开发区块链应用。 6 | 7 | 本章主要内容: 8 | * [IBM Bluemix区块链平台](./chapter7_01%20ibm_bluemix_baas.md) 9 | * [阿里云区块链平台](./chapter7_02%20aliyun_baas.md) 10 | * [使用Cello搭建区块链平台](./chapter7_03%20cello.md) 11 | * [区块链即服务知识总结](./chapter7_04%20summary.md) -------------------------------------------------------------------------------- /chapter7_01 ibm_bluemix_baas.md: -------------------------------------------------------------------------------- 1 | ## IBM Bluemix 区块链平台 2 | 3 | IBM区块链技术可通过Bluemix访问,该项技术基于Linux基金会的开源项目“超级账本”(Hyperledger),能够为用户提供一套开放的基础架构,帮助用户迅速构建与测试新的区块链应用及行业应用。 4 | 5 | * 基于 Linux 基金会的开源项目 Hyperledger Fabric v1.0 和 IBM PaaS 云平台 6 | * 提供端到端的区块链平台解决方案 7 | * 快速搭建高可用的区块链网络 8 | * 提供区块链平台安全特性 9 | * 配备完整的自服务运维系统屏蔽 IT 的复杂度 10 | 11 | ### IBM 区块链即服务BaaS平台应用场景 12 | 13 | **1. 企业需要开箱即用的区块链平台:** 14 | 15 | IBM BaaS 平台支持多租户场景,具备服务发现、共享存储、日志监控、DevOps 等企业级能力。 16 | 17 | **2. 企业需要高可用和动态扩展的区块链网络底层框架:** 18 | 19 | IBM BaaS 平台集成 Kubernetes,支持 master 节点,共享存储,节点故障恢复,帮助应对高数据增长带来的挑战。 20 | 21 | **3. 企业希望集中内部开发资源于上层业务应用,而非底层架构:** 22 | 23 | IBM BaaS 平台提供 SDK、CLI 样例,供企业开发团队基于 IBM PaaS 云平台灵活快速配置区块链网络。 24 | 25 |
26 | 27 | 28 | ![IBM Bluemix 区块链平台](./pic/auto/image122.jpg) 29 | 30 | 7-01 IBM Bluemix 区块链平台 31 |
32 | 33 | ### IBM 区块链即服务BaaS平台的优势 34 | 35 | **1. 端到端的区块链解决方案** 36 | 37 | * 保证区块链的底层网络和存储要求 38 | * 可以提供区块链应用上线的自动化流程 39 | * 对区块链提供全方位的运维管理 40 | * 可与 P4、PureApp 进行集成 41 | 42 | **2. 快速搭建高可用性区块链网路** 43 | 44 | * 基于模板,快速自动化搭建 45 | * 私有区块链镜像存储,版本一致稳定 46 | * 无缝对接 IBM PaaS 云平台底层服务 47 | * 节点故障可实现快速恢复 48 | * 可定制区块链功能和拓扑结构 49 | 50 | **3. 完整的自服务运维系统** 51 | 52 | * IBM PaaS 云平台自运维具有独立的运维模型和相应的支撑组件 53 | * 支持全景视图 54 | * 全面监测 IT 问题,发现问题根源 55 | 56 | 如果对IBM区块链服务平台感兴趣,那就赶紧[注册](https://console.ng.bluemix.net/catalog/services/blockchain)试用吧。 -------------------------------------------------------------------------------- /chapter7_02 aliyun_baas.md: -------------------------------------------------------------------------------- 1 | ## 阿里云区块链平台 2 | 3 | 阿里云区块链服务(Blockchain as a Service,简称BaaS)是企业级区块链平台服务,支持Hyperledger Fabric、蚂蚁金服自研区块链技术、以及企业以太坊Quorum,为您构建更安全稳定的区块链环境,简化部署运维及开发流程,实现业务快速上链。 4 | 5 |
6 | 7 | 8 | ![阿里云区块链平台](./pic/auto/image123.jpg) 9 | 10 | 7-02 阿里云区块链平台 11 |
12 | 13 | 阿里云区块链平台的搭建非常方便,只需三步即可完成平台的搭建。大家可以参照[官方文档](https://help.aliyun.com/product/84950.html)进行[操作](https://baas.console.aliyun.com/),开启你的区块链之旅吧! 14 | 15 | -------------------------------------------------------------------------------- /chapter7_03 cello.md: -------------------------------------------------------------------------------- 1 | ## 使用Cello搭建区块链平台 2 | 3 | Hyperledger Cello 是超级账本项目下面的子项目,提供按需部署的功能,可以将区块链部署在各种裸机、虚拟机、容器等环境中。该项目最初由IBM发起,目前得到了Soramitsu、华为和Intel的赞助。 4 | 5 | ### 简介 6 | 7 | 基于Fabric和成熟的云计算PaaS工具, Cello可以非常方便的开展如下工作: 8 | 9 | * 可以非常方便的搭建一个BaaS平台。 10 | * 提供可定制的区块链,例如Hyperledger Fabric V1.0网络。 11 | * 在裸机、虚拟云以及容器集群中维护一个区块链网络池。 12 | * 通过仪表盘检查系统状态,调整区块链网络,扩展资源,等等。 13 | 14 |
15 | 16 | 17 | ![Cello](./pic/auto/image125.jpg) 18 | 19 | 7-03-01 Cello 20 |
21 | 22 | Cello遵循了典型的主从架构。主节点(Master)负责管理整个区块链网络。提供了8080端口的WEB界面和80端口的RESTful API。强烈建议用Linux系统作为主节点。从节点(Workers)是由各节点组成的区块链网络。Cello支持各种类型的从节点,可以运行在Docker、Swarm、k8s、VSphere或者裸机上。 23 | 24 |
25 | 26 | 27 | ![Cello的主从架构](./pic/auto/image126.jpg) 28 | 29 | 7-03-02 Cello的主从架构 30 |
31 | 32 | ### 配置主节点 33 | 1. 下载Cello代码 34 | ``` 35 | $ git clone https://github.com/hyperledger/cello.git 36 | $ cd cello 37 | ``` 38 | 2. 设置主节点 39 | ``` 40 | $ make setup-master 41 | ``` 42 | 3. 启动Cello服务 43 | ``` 44 | $ make start 45 | ``` 46 | 47 | ### 配置从节点 48 | 对于Ubuntu 16.04,修改/lib/systemd/system/docker.service文件,更新Service下的ExecStart配置项。 49 | ``` 50 | [Service] 51 | ExecStart=/usr/bin/dockerd -H fd:// -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 --default-ulimit=nofile=8192:16384 --default-ulimit=nproc=8192:16384 52 | ``` 53 | 重新启动docker engine服务。 54 | 55 | ``` 56 | $ sudo systemctl daemon-reload; sudo systemctl restart docker.service 57 | ``` 58 | 设置从节点(Worker)。 59 | 60 | ``` 61 | $ make setup-worker 62 | ``` 63 | 确保节点容器可以访问,需要开启IP转发功能。 64 | ``` 65 | $ sysctl -w net.ipv4.ip_forward=1 66 | ``` 67 | 68 | ### 设置Cello网络 69 | 70 | 通过8081端口访问仪表盘,默认情况下账户是admin:pass。 71 | 刚打开仪表盘是没有主机的(host),需要先添加主机。 72 | 73 |
74 | 75 | 76 | ![添加主机](./pic/auto/image127.jpg) 77 | 78 | 7-03-03 添加主机 79 |
80 | 81 | 输入集群的名字、主机、链的尺寸,创建新的链。 82 | 83 |
84 | 85 | 86 | ![创建新的链](./pic/auto/image128.jpg) 87 | 88 | 7-03-04 创建新的链 89 |
90 | 91 | 输入区块链名称、类型,创建区块链网络。 92 | 93 |
94 | 95 | 96 | ![创建区块链网络](./pic/auto/image129.jpg) 97 | 98 | 7-03-05 创建区块链网络 99 |
100 | 101 | 接着就可以添加智能合约、安装部署智能合约,进行合约的测试了。 102 | 103 |
104 | 105 | 106 | ![智能合约测试](./pic/auto/image130.jpg) 107 | 108 | 7-03-06 智能合约测试 109 |
110 | 111 | 详细信息请参照官方文档: https://hyperledger-cello.readthedocs.io/en/latest/ 112 | 113 | Cello:https://github.com/hyperledger/cello 114 | Setup Cello: 115 | https://hyperledger-cello.readthedocs.io/en/latest/setup/setup/ 116 | 117 | -------------------------------------------------------------------------------- /chapter7_04 summary.md: -------------------------------------------------------------------------------- 1 | ## 区块链BaaS知识总结 2 | 3 | 区块链即服务可以降低区块链的应用门槛。 4 | 5 | 本章我选取了IBM Bluemix区块链平台和阿里云区块链平台,同时也给出了自己搭建Fabric BaaS的方法。 6 | 7 | 祝大家学习快乐! -------------------------------------------------------------------------------- /chapter8_00.md: -------------------------------------------------------------------------------- 1 | # 区块链技术发展趋势 2 | 3 | 大部分人对区块链都有一个误区,以为区块链是万能的。如果你给他说区块链这个不能做,那个不能做,他就会很不屑的来一句,“哦!!!区块链其实也干不了啥。”持这种观点的人是受到了外界很多人将区块链技术神话的影响。真相是任何一项技术都不可能包打天下,只有充分认识到一项技术的特点,将这项技术与其它技术结合起来,才能将一项技术的优势发挥出来,才能让一项技术真正造福人类。 4 | 5 | 我们现在熟悉的互联网技术,其实也是一个大杂烩,除了TCP/IP、HTTP、HTML相关技术之外,经过这么多年的发展,融合了云计算、大数据、人工智能等许多技术才走到今天,才让一项当初只能发邮件、浏览网页、玩游戏的技术演变成一项改变人类文明进程的技术。 6 | 7 | 区块链作为传统互联网技术的一个有益补充,也会经历同样的路径。当区块链技术与云计算、大数据、人工智能、物联网等技术充分融合后,区块链才能真正发挥它的威力。 8 | 9 | 就拿现在火热的人工智能技术来说,其实是依赖于大数据技术的发展。大数据和人工智能算法的结合,促进了人工智能技术的发展,才有了谷歌阿法狗大战李世石、柯洁的战绩。 10 | 11 | 我们前面提到的区块链溯源,如果没有物联网技术,区块链溯源也很难发展起来。区块链作为一个不可篡改的数据库,数据的真实性需要通过物联网技术进行数据采集才能保证数据的真实性。如果上链数据是人工录入,这样就很难保证链上数据的真实性,区块链的价值也就无法真正体现出来。 12 | 13 | 区块链技术还处于早期,区块链的可扩展性、智能合约安全、隐私保护和监管是区块链现阶段主要面临的挑战,同时也是极客和各领域专家最为痴迷的地方。问题中往往潜藏着机会。把握区块链发展趋势,在问题中寻找机会,才能抓住区块链世界里的机会。 14 | 15 | 本章主要内容: 16 | * [区块链技术融合(大数据、人工智能、物联网)](./chapter8_01%20blockchain_technology_integration.md) 17 | * [区块链技术面临的主要挑战](./chapter8_02%20blockchain_technology_challenges.md) 18 | * [区块链技术发展趋势](./chapter8_03%20blockchain_technology_trend.md) 19 | * [区块链技术发展趋势总结](./chapter8_04%20summary.md) -------------------------------------------------------------------------------- /chapter8_01 blockchain_technology_integration.md: -------------------------------------------------------------------------------- 1 | ## 区块链技术融合(大数据、人工智能、物联网) 2 | 3 | ### 区块链与大数据 4 | 5 | 数据被称为“21世纪的石油”。一方面是互联网公司通过大量的用户数据在商业上得到了前所未有的发展,另一方面是政府、企业信息化面临的数据孤岛、数据质量低的困境。 6 | 7 | 互联网发展到现在,掌握了大量的用户数据,创造了巨大的经济效益,同时也面临着用户隐私泄露的危机。Facebook就因为泄露了超过5000万用户的隐私数据备受责难,而社会也因为这些数据的泄露受到了重大影响。同时互联网充斥着大量的低质量数据,也制约了大数据的进一步发展。 8 | 9 | 一些政府、教育、医疗等行业,由于缺乏统一的数据标准,各个部门为了维护自身利益缺乏共享数据的动力,导致这些行业发展水平远远落后于互联网的发展水平。 10 | 11 | 数据是未来最重要的生产资源,不但规模巨大,而且将随着人类行为的变迁而不断流变,成为我们测量、理解一个时代商业和社会的关键,未来将会是全行业的标配。而区块链技术,是未来世界最重要的基础技术之一,它构建了一个让所有参与者都可以共同维护的可信价值互联网。区块链作为一个传输价值的信任网络,能够让数据这项最重要的生产资源,在流通中的成本降至最低。可以说,区块链这项未来最重要的底层技术,与数据这项未来最重要的社会资源结合在一起,能够释放出极大的商业价值、社会价值。 12 | 13 | 基于区块链可以重构大数据产业,建立一个可信任的数据交换价值网络。由于区块链具备去中心化、点对点交易、数据不可篡改、匿名性等特点,可以将数据获取、数据交换及数据分析的每一步都记录在链上,为数据建立强有力的信任背书,极大程度上促进大数据产业的快速发展。 14 | 15 | 具体实现上,基于区块链点对点交易的特性,可以提供与中心化数据交易(如数据中间商,数据黑市)完全不同的解决方案。基于区块链技术,数据交易双方可以直接进行点对点的数据交易和交换,拥有不缓存数据、保护隐私等特性;采用去中心化的分布式存储方案,并通过密码机制、授权机制让数据所有权真正回归用户;基于区块链价值传递的网络特性,可以建立一套有效的数据贡献激励机制,确保数据的高质量。 16 | 17 | 进一步来讲,采用区块链智能合约,可实现更小粒度的交易模式,改变现在大数据的商业模式,基于区块链价值转移网络逐步推动形成基于全球化的数据交易场景,建立真正属于全社会的大数据产业。 18 | 举个例子,之前我们的数据都是存储在中心化服务器上,这些中心化机构拥有我们数据的所有权,他们可以为所欲为,完全不用与贡献数据的用户进行沟通。 19 | 20 | 采用区块链技术,用户将数据存储在一个大家都信任的公有链上,由于使用了数字签名技术,这样数据的所有权不隶属于任何中心化机构,用户就拥有了数据的话语权。任何人想获取数据,他不用关心数据背后的主人是谁,只需要按照自己的需要支付一定的费用,这样用户一方面拥有自己数据的所有权,另一方面可以通过贡献数据获得收益。 21 | 22 | 区块链和大数据两项技术各有自己的优缺点,在实践中,需要将两者的优势结合起来使用。 23 | 24 | 区块链是一个历史记录数据不可篡改的记录,随着时间的变化,数据量会变得越来越大,对于链上数据的统计、分析会变得越来越困难,大数据海量存储能力和分析能力可以极大地提升区块链的价值和未来的空间。 25 | 26 | 在大数据上使用区块链技术,可以保证一些数据不可篡改。实际生活中,我们会把一些信任成本比较高的数据(记账数据、归档数据)放在链上,一些信任成本较低的数据存储在大数据上。 27 | 28 | 区块链只能保证数据不可篡改,至于数据真实性需要在数据上链之前保证。如果将造假数据放在链上,同样也无法删除、无法修改,这是区块链与之前数据库技术不同的地方,大家在数据上链之前一定要谨慎。某种程度区块链使得造假的成本变得很高,提高了人与人之间的信任程度。 29 | 30 | ### 区块链与人工智能 31 | 32 | 现在人工智能的高速发展要归功于大数据产业的发展。在人工智能发展的路上,人类将一切人工智能问题都可以通过数据来解决,通过大数据不断优化机器算法模型,很多领域已经超过了人类的能力。 33 | 34 | 语音方面,Google助手就是建立在谷歌庞大的用户数据基础之上,另外一个就是亚马逊的 Alexa,它是采用开放平台的方式与合作伙伴进行合作,而类似科大讯飞这样的企业,虽然在技术上遥遥领先,但在实际应用上却远远落后于谷歌、亚马逊这样的巨头公司,究其原因主要是这些企业没有足够的数据来训练自己的算法模型。 35 | 36 | 人工智能的核心就是算力、算法模型和数据。目前各个公司在算力和算法模型的差距没有质的差别,基本上都是通过数据不断喂养机器,使得机器具有更强的认知能力。对于大部分人工智能初创企业,由于数据的缺失,导致企业发展非常缓慢,很多技术只能停留在实验阶段,无法大规模应用。尤其是医疗、教育等行业的数据缺失,使得这些行业滞后于社会的整体发展水平。 37 | 38 | 人工智能和区块链是现代两个非常重要的技术。人工智能是一种生产力,它能提高生产效率,使得我们更快、更有效的获取财富。而区块链是一种生产关系,它能够改变我们现在的利益分配关系。虽然人工智能和区块链都有各自技术的复杂性,但区块链技术与人工智能融合可以为人工智能提供新的发展思路。 39 | 40 | 一种思路是通过区块链与人工智能结合,可以获取高质量的数据来训练AI模型,解决现在人工智能的痛点。区块链对人工智能的影响有可能会改变现在人工智能发展的现状,让具有技术优势的企业也能参与人工智能这场革命中,构建全球数据共享和AI模型生态,带动整个社会高速发展。 41 | 42 | 比如企业要开发自己的语音识别系统,一方面要研究语音技术,另一方面要获取大量的语言数据(这其中包含中文、英文、日文等等,也包含各种方言)。对于企业来说,最难的就是获取大量数据来训练自己的模型算法。如果采用区块链技术就可以建立一种数据激励机制,刺激用户贡献数据,让语音算法模型有足够的数据来训练,另一方面也可以让更多语音算法爱好者通过区块链方便地获取数据,参与到语音识别系统的开发中。 43 | 44 | 人工智能与区块链的结合优势非常明显,但由于区块链技术本身还不成熟,人工智能门槛也比较高,关于区块链在人工智能领域的发展目前还处于探索阶段,未来这个领域还需要更多专家参与才能找到真的结合点。 45 | 46 | ### 区块链与物联网 47 | 48 | 物联网的英文是Internet of things(IoT),实际上它还是基于现在的互联网。物联网和现在互联网网不一样的地方是,互联网只是将人连接在网络上,而物联网是通过传感器技术将人和物都连接在网络上。物联网会比我们想象的复杂的多,它不仅是一项技术,未来会影响到我们生活的方方面面。 49 | 50 | 随着5G、RFID 等技术的不断发展,物联网将会构建一个物物相连、物物相惜的复杂业务场景。但在这种复杂业务场景下,由于物联网对网络和运算能力要求非常高,传统互联网已经无法解决物联网所面临的问题了。我们可以想象一下在一个万物互联的世界里,我们家里的电视、冰箱、洗衣机等各种智能家电,包括我们衣服、鞋子、眼镜等设备都已经连接到网络上,不管是对计算机运算能力,还是网络的复杂程度,传统互联网已经无法解决这种复杂的信息交互场景了。 51 | 52 | 未来的物联网每个设备都会是网络中的一个节点,随着物联网设备的增加,对于服务器的计算能力要求会越来越高,大量设备需求分布式自治的方式进行组织和管理,并且对系统的容错性比较高。 53 | 54 | 区块链分布式自治的方式很好的适用这种场景,通过区块链技术可以为每台设备分配一个地址,并给每个地址注入一定的费用,设备与设备之间就可以直接交互,无需人工干预。 55 | 56 | 由物联网中的传感器网络产生的信息本身就具备价值特性,执行机构也能用行为产生价值,这些价值在设备间的流动可以利用区块链的货币特性,催生出具备自主资源产生能力的设备,它们不仅可以为机器服务,更能为人服务。 57 | 58 | 举个例子,只要用过自动贩卖机的人,都能轻易理解设备有自己的“钱包”是什么概念。自动贩卖机目前只是一个有收钱(硬币或纸钞)功能的机器,例如你投入5元会掉出一罐可乐。但是这台机器其实是需要定期花钱的,例如保养费。现在的模式是安置自动贩卖机的厂商定期派人去回收自动贩卖机内的钱,再用自动贩卖机赚到的一部分钱,来支付机器保养费,不仅耗费人力,而且效率不高。 59 | 60 | 如果自动贩卖机在未来不仅能收钱,还能够自己花钱呢?这个情况不难想象,如果机器有了自己的“钱包”,也就可以每个月自动通知机器维护厂商来保养,并自己从机器的钱包内支付。自动贩卖机除了要支付保养费之外,还有定期的电费、场地租金,都可以交给机器自主完成。因此,在物联网非常需要一个类似区块链的技术来避免资料被修改,以确保物联网设备之间的彼此信任。 61 | 62 | 目前在物联网领域有一个项目叫IOTA,大家可以关注一下这个项目的技术。虽然区块链技术还在发展初期,但是可以肯定的是区块链技术将来一定会在物联网领域得到长足的发展。 63 | -------------------------------------------------------------------------------- /chapter8_02 blockchain_technology_challenges.md: -------------------------------------------------------------------------------- 1 | ## 区块链技术面临的主要挑战 2 | 3 | 我们已经知道,影响区块链扩展性的主要原因是每笔交易都要在所有节点上达成一致,也就是说每个节点都需要对交易数据进行验证和存储,这就直接影响到了区块链的扩展性。 4 | 5 | 目前,提高区块链扩展性的商业解决方案有共识机制创新、区块扩容、有向无环图(DAG)、分片(sharding)、跨链、闪电网络等。共识机制是影响区块链扩展性的核心因素,交易存储方式(区块扩容、有向无环图、分片)是影响区块链扩展性的基础条件,而跨链是提高区块链扩展性的终极手段。 6 | 7 | 共识机制创新的方向是在保证安全的前提下减少节点的参与数量。区块扩容、有向无环图是对区块链数据结构进行改良和升级,其中区块扩容是直接增加区块链的交易处理量,而有向无环图使用了与链状数据结构完全不同的图状数据结构,分片借鉴了现代数据库的分片思想。跨链是区块链向外拓展和连接的桥梁,使得区块链不同链之间可以安全通讯,让区块链大规模商业应用成为可能。 8 | 9 | -------------------------------------------------------------------------------- /chapter8_03 blockchain_technology_trend.md: -------------------------------------------------------------------------------- 1 | ## 区块链的发展趋势 2 | 3 | ### 智能合约 4 | 智能合约给区块链带来了新的生机,但由于智能合约是运行在沙盒(sandbox)机制里(以太坊智能合约运行在EVM中,EOS智能合约运行在WASM中),无法从现实世界获取数据。因此,怎样将现实世界与区块链链接起来是影响智能合约技术发展的一个重要瓶颈。 5 | 6 | 传统编程中,业务逻辑是可以非常方便地调用外部数据,但在以太坊、EOS上等公链上进行智能合约开发,合约只能调用链上的内部数据,无法与外部系统进行直接交互。 7 | 8 | 预言机是用来连接现实世界与区块链世界,是区块链应用的大规模应用的的一个桥梁。 9 | 10 | 智能合约本身就是一段运行在区块链上的代码,因此存在bug在所难免。与传统软件不一样的是,公链天然与钱有关系,因此特别容易受到全世界黑客的“关照”。 11 | 12 | 要保证智能合约的安全除了加强代码开发规范,进行严格测试之外,由专业的安全厂商进行智能合约审计是区块链行业不可或缺的一个重要环节。 13 | 14 | ### 区块链隐私保护 15 | 由于区块链账务公开的特点,通过区块链浏览器可以非常方便地查询账户相关交易信息。随着区块链的商业价值被不断发现,隐私保护逐渐成为区块链行业重点研究对象。 16 | 17 | 这就如同早期的互联网网站,使用的都是HTTP协议,之后为了电子商务等业务需要引入了HTTPS协议。 18 | 19 | 区块链隐私保护的研究目前主要集中在数字货币和智能合约两个领域。 20 | 21 | 目前最受关注的隐私保护方案是零知识证明机制。 22 | 23 | 零知识证明的研究始于1985年Shafi Goldwasser 等人的论文《The Knowledge Complexity of Interactive Proof-Systems 》,目前一般认为至少要满足三个条件: 24 | 25 | * 完整性( Completeness ):真实的证明可以让验证者成功验证; 26 | * 可靠性( Soundness ):虚假的证明无法让验证者通过验证,但允许存在小概率例外; 27 | * 零知识( Zero-Knowledge ):如果被证明,但无法从证明过程中获取除证明信息之外的任何信息。 28 | 29 | 零知识证明的本质在于通过简单的披露可以证明某个信息的占有,挑战也是在不披露信息本身或任何额外信息的情况下证明这种占有。 30 | 31 | 如果验证语句要求验证者拥有一些秘密信息,那么验证者将无法在不拥有秘密信息的情况下向其他人证明该语句。 32 | 33 | 被证明的陈述必须包括证明者拥有这种知识的断言,但不包括知识本身。否则,该语句将不能称为零知识证明,因为它在协议结束时为验证者提供了关于该语句的附加信息。 34 | 35 | ### 法律法规有待完善 36 | 37 | 法律法规一般都会滞后于社会发展。一项技术初期,使用严格的法律、法规来约束,一定程度上会抑制技术创新的活力。比如现在互联网领域的共享经济,政府采用的是“让子弹飞一会儿”的策略,等技术成熟后再出台相关政策、法规来进行规范。 38 | 39 | 区块链现在还处于早期,同时区块链又具有去中心化、自治的特点,因此区块链在技术治理、监管和标准制定方面都存在很多问题,主要体现在以下两个方面: 40 | 41 | 1. 法律主体不明确 42 | 43 | 区块链系统中,由于系统维护和治理采用了分散化的治理结构,导致不存在一个明确的主体为整个系统承担责任,缺乏中心化的法律实体,使得法律法规在事后难以对区块链项目进行监管。 44 | 45 | 传统的事前监管和中心化的监管会导致徒劳无功的现象。中国人民大学金融科技与互联网安全研究中心主任、大数据区块链与监管实验室主任杨东在《区块链+监管=法链(RegChain)》一书中提出,需要通过监管科技(Regtech)进行更有效地监管,让区块链技术为监管所用。他强调,“以链治链”,通过区块链技术加强监管是区块链技术一个非常重要的应用场景,“政府需要通过技术手段来改变监管方式,提高监管效率,降低监管成本,提升自身的服务能力,基于区块链的规制系统将有助于提高监管的有效性,‘区块链+监管’,即‘法链(RegChain)’是未来监管的新方向。” 46 | 47 | 2. 链上规则不明确 48 | 区块链智能合约虽然被称为“代码即法律”(Code is Law),但实际却是一种乌托邦的梦想。 49 | 50 | “代码即法律”不是区块链才有的,这种思想(包括去中心化)诞生于互联网早期,由网络工程师蒂姆·伯纳斯·李提出。但现实是互联网已经彻底中心化了,互联网巨头已经成为新的中心。当“代码即法律”这个古老的思想再次复活的时候,我们需要清楚法律与代码的区别。 51 | 52 | 法律是一个非常复杂的体系,涉及到历史、政治、经济、技术、文化等各种因素,通常需要一整套完整的制度来实施,同时法律也并不像大家想象的那样是一条条冰冷的法条,法律是讲法理的。 53 | 54 | 代码是有限制的,这种限制是由区块链系统的安全性和稳定性决定的。由于区块链技术规则不明确,会引发智能合约漏洞、Token合规性和隐私保护等问题。不管理想主义者怎样吹嘘,我们需要面对的事实是代码不是法律,代码只能作为法律的辅助手段,但无法替代法律本身。 55 | 56 | 2015 年 2 月,《经济学人》在《信任机器:区块链的承诺》这篇著名文章中警告: 57 | 58 | > “在早期阶段,拟定区块链监管法将是一个错误。”然而,时过境迁,在区块链甚嚣尘上的中国,监管出场可能并非坏事,但问题是监管将以何种形式出场?对此,《经济学人》的警告依然有效——不能僵化、不能冒险。 59 | 60 | -------------------------------------------------------------------------------- /chapter8_04 summary.md: -------------------------------------------------------------------------------- 1 | ## 区块链技术发展趋势知识总结 2 | 3 | 区块链的可扩展性、智能合约安全、隐私保护和监管是区块链现阶段主要面临的挑战,同时也是极客和各领域专家最为痴迷的地方。问题中往往潜藏着机会。把握区块链发展趋势,在问题中寻找机会,才能抓住区块链世界里的机会。 4 | 5 | 希望大家通过本教程的学习能够掌握区块链实施技能,进而在区块链世界里找到属于自己的机会。 6 | 7 | 大家在学习过程中如果遇到任何问题,欢迎一起讨论,一起进步。 8 | 9 | 微信:253841918 10 | mail: 253841918@qq.com -------------------------------------------------------------------------------- /chapter9_00.md: -------------------------------------------------------------------------------- 1 | # 课程总结 2 | 3 | 本课程涉及理论、开发、运维相关知识,学完这个课程大家初步具备了全栈区块链工程师所具备的能力。 4 | 5 | 你可以根据自己的兴趣,选择以下方向继续深入学习: 6 | ## 方案设计 7 | 8 | 方案设计是设计中的重要阶段,它是一个极富有创造性的设计阶段,同时也是一个十分复杂的问题,它涉及到设计者的知识水平、经验、灵感和想象力等。 9 | 10 | 方案是一个项目开端,只有方案评审通过,后续的工作才能正常开展,所以方案非常重要。如果你长期从事售前相关工作,可以将重点放在方案设计上。 11 | 12 | 本教程与方案编写相关的章节如下: 13 | 14 | * [区块链技术理论](./chapter1_00.md) 15 | * [Hyperledger Fabric 架构详解](./chapter3_00.md) 16 | 17 | ## 架构设计 18 | 19 | 架构设计是将客户的需求转换为规范的开发计划及文本,并制定这个项目的总体架构,指导整个开发团队完成这个计划。 20 | 21 | 架构设计是软件设计过程的早期阶段,它把需求分析和设计流程连接在一起。架构师的主要任务不是从事具体的软件程序的编写,而是从事更高层次的开发构架工作。他必须对开发技术非常了解,并且需要有良好的组织管理能力。可以这样说,一个架构师工作的好坏决定了整个软件开发项目的成败。 22 | 23 | 本教程与架构设计相关的章节如下: 24 | * [区块链技术理论](./chapter1_00.md) 25 | * [Hyperledger Fabric 架构详解](./chapter3_00.md) 26 | * [区块链溯源案例分析](./chapter6_00.md) 27 | * [区块链即服务](./chapter7_00.md) 28 | * [区块链技术发展趋势](./chapter8_00.md) 29 | 30 | ## 系统开发 31 | 系统开发是根据架构设计实现软件的过程。 32 | 33 | 本教程与系统开发相关的章节如下: 34 | * [区块链技术理论](./chapter1_00.md) 35 | * [区块链开发实战预备知识](./chapter2_00.md) 36 | * [Hyperledger Fabric 架构详解](./chapter3_00.md) 37 | * [区块链溯源案例分析](./chapter6_00.md) 38 | 39 | ## 系统运维 40 | 系统运维主要是负责Fabric网络搭建、合约部署、应用部署以及后续的升级工作。 41 | 42 | 本教程与系统运维相关的章节如下: 43 | * [区块链技术理论](./chapter1_00.md) 44 | * [Hyperledger Fabric 架构详解](./chapter3_00.md) 45 | * [Fabric网络搭建详解](./chapter4_00.md) 46 | 47 | ## 后续学习建议 48 | 从学习角度来说,这里推荐大家可以花点时间参加一下官方的[CHFA证书](https://training.linuxfoundation.org/training/hyperledger-fabric-administration-lfs272/)。 49 | 50 |
51 | 52 | 53 | ![CHFA证书](./pic/auto/image133.jpg) 54 | 55 | 9-01 CHFA认证 56 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /pic/Hyperledger_fabirc_tuna_application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/Hyperledger_fabirc_tuna_application.png -------------------------------------------------------------------------------- /pic/alipay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/alipay.png -------------------------------------------------------------------------------- /pic/aliyun_mirrors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/aliyun_mirrors.png -------------------------------------------------------------------------------- /pic/auto/image053.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image053.jpg -------------------------------------------------------------------------------- /pic/auto/image054.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image054.jpg -------------------------------------------------------------------------------- /pic/auto/image055.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image055.jpg -------------------------------------------------------------------------------- /pic/auto/image056.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image056.jpg -------------------------------------------------------------------------------- /pic/auto/image057.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image057.jpg -------------------------------------------------------------------------------- /pic/auto/image058.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image058.jpg -------------------------------------------------------------------------------- /pic/auto/image059.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image059.jpg -------------------------------------------------------------------------------- /pic/auto/image060.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image060.jpg -------------------------------------------------------------------------------- /pic/auto/image061.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image061.jpg -------------------------------------------------------------------------------- /pic/auto/image062.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image062.jpg -------------------------------------------------------------------------------- /pic/auto/image063.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image063.jpg -------------------------------------------------------------------------------- /pic/auto/image064.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image064.jpg -------------------------------------------------------------------------------- /pic/auto/image065.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image065.jpg -------------------------------------------------------------------------------- /pic/auto/image066.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image066.jpg -------------------------------------------------------------------------------- /pic/auto/image067.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image067.jpg -------------------------------------------------------------------------------- /pic/auto/image068.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image068.jpg -------------------------------------------------------------------------------- /pic/auto/image069.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image069.jpg -------------------------------------------------------------------------------- /pic/auto/image070.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image070.jpg -------------------------------------------------------------------------------- /pic/auto/image071.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image071.jpg -------------------------------------------------------------------------------- /pic/auto/image072.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image072.jpg -------------------------------------------------------------------------------- /pic/auto/image073.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image073.jpg -------------------------------------------------------------------------------- /pic/auto/image074.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image074.jpg -------------------------------------------------------------------------------- /pic/auto/image075.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image075.jpg -------------------------------------------------------------------------------- /pic/auto/image076.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image076.jpg -------------------------------------------------------------------------------- /pic/auto/image077.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image077.jpg -------------------------------------------------------------------------------- /pic/auto/image078.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image078.jpg -------------------------------------------------------------------------------- /pic/auto/image079.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image079.jpg -------------------------------------------------------------------------------- /pic/auto/image080.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image080.jpg -------------------------------------------------------------------------------- /pic/auto/image081.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image081.jpg -------------------------------------------------------------------------------- /pic/auto/image082.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image082.jpg -------------------------------------------------------------------------------- /pic/auto/image083.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image083.jpg -------------------------------------------------------------------------------- /pic/auto/image084.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image084.jpg -------------------------------------------------------------------------------- /pic/auto/image085.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image085.jpg -------------------------------------------------------------------------------- /pic/auto/image086.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image086.jpg -------------------------------------------------------------------------------- /pic/auto/image087.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image087.jpg -------------------------------------------------------------------------------- /pic/auto/image088.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image088.jpg -------------------------------------------------------------------------------- /pic/auto/image089.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image089.jpg -------------------------------------------------------------------------------- /pic/auto/image090.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image090.jpg -------------------------------------------------------------------------------- /pic/auto/image091.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image091.jpg -------------------------------------------------------------------------------- /pic/auto/image092.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image092.jpg -------------------------------------------------------------------------------- /pic/auto/image093.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image093.jpg -------------------------------------------------------------------------------- /pic/auto/image094.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image094.jpg -------------------------------------------------------------------------------- /pic/auto/image095.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image095.jpg -------------------------------------------------------------------------------- /pic/auto/image096.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image096.jpg -------------------------------------------------------------------------------- /pic/auto/image097.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image097.jpg -------------------------------------------------------------------------------- /pic/auto/image098.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image098.jpg -------------------------------------------------------------------------------- /pic/auto/image099.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image099.jpg -------------------------------------------------------------------------------- /pic/auto/image100.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image100.jpg -------------------------------------------------------------------------------- /pic/auto/image101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image101.jpg -------------------------------------------------------------------------------- /pic/auto/image102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image102.jpg -------------------------------------------------------------------------------- /pic/auto/image103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image103.png -------------------------------------------------------------------------------- /pic/auto/image104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image104.jpg -------------------------------------------------------------------------------- /pic/auto/image105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image105.jpg -------------------------------------------------------------------------------- /pic/auto/image106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image106.jpg -------------------------------------------------------------------------------- /pic/auto/image107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image107.jpg -------------------------------------------------------------------------------- /pic/auto/image108.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image108.jpg -------------------------------------------------------------------------------- /pic/auto/image109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image109.jpg -------------------------------------------------------------------------------- /pic/auto/image110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image110.jpg -------------------------------------------------------------------------------- /pic/auto/image111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image111.jpg -------------------------------------------------------------------------------- /pic/auto/image112.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image112.jpg -------------------------------------------------------------------------------- /pic/auto/image113.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image113.png -------------------------------------------------------------------------------- /pic/auto/image114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image114.png -------------------------------------------------------------------------------- /pic/auto/image115.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image115.jpg -------------------------------------------------------------------------------- /pic/auto/image116.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image116.png -------------------------------------------------------------------------------- /pic/auto/image117.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image117.jpg -------------------------------------------------------------------------------- /pic/auto/image118.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image118.jpg -------------------------------------------------------------------------------- /pic/auto/image119.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image119.jpg -------------------------------------------------------------------------------- /pic/auto/image120.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image120.jpg -------------------------------------------------------------------------------- /pic/auto/image121.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image121.jpg -------------------------------------------------------------------------------- /pic/auto/image122.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image122.jpg -------------------------------------------------------------------------------- /pic/auto/image123.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image123.jpg -------------------------------------------------------------------------------- /pic/auto/image124.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image124.jpg -------------------------------------------------------------------------------- /pic/auto/image125.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image125.jpg -------------------------------------------------------------------------------- /pic/auto/image126.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image126.jpg -------------------------------------------------------------------------------- /pic/auto/image127.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image127.jpg -------------------------------------------------------------------------------- /pic/auto/image128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image128.jpg -------------------------------------------------------------------------------- /pic/auto/image129.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image129.jpg -------------------------------------------------------------------------------- /pic/auto/image130.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image130.jpg -------------------------------------------------------------------------------- /pic/auto/image131.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image131.jpg -------------------------------------------------------------------------------- /pic/auto/image132.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image132.png -------------------------------------------------------------------------------- /pic/auto/image133.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/auto/image133.jpg -------------------------------------------------------------------------------- /pic/bitcoin_paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/bitcoin_paper.png -------------------------------------------------------------------------------- /pic/bitcoin_peers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/bitcoin_peers.png -------------------------------------------------------------------------------- /pic/bitcoin_transaction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/bitcoin_transaction.png -------------------------------------------------------------------------------- /pic/blockchain_application_principle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/blockchain_application_principle.png -------------------------------------------------------------------------------- /pic/book.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/book.jpg -------------------------------------------------------------------------------- /pic/book_and_project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/book_and_project.png -------------------------------------------------------------------------------- /pic/bring_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/bring_up.png -------------------------------------------------------------------------------- /pic/byfn_sh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/byfn_sh.png -------------------------------------------------------------------------------- /pic/configure_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/configure_file.png -------------------------------------------------------------------------------- /pic/cover/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/cover/1.png -------------------------------------------------------------------------------- /pic/cover/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/cover/2.png -------------------------------------------------------------------------------- /pic/cover/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/cover/3.png -------------------------------------------------------------------------------- /pic/cover/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/cover/4.jpg -------------------------------------------------------------------------------- /pic/cover/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/cover/5.png -------------------------------------------------------------------------------- /pic/cover/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/cover/6.png -------------------------------------------------------------------------------- /pic/cover/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/cover/7.png -------------------------------------------------------------------------------- /pic/distributed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/distributed.png -------------------------------------------------------------------------------- /pic/docker_hello_world.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/docker_hello_world.png -------------------------------------------------------------------------------- /pic/fabric_architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/fabric_architecture.png -------------------------------------------------------------------------------- /pic/fabric_ca_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/fabric_ca_diagram.png -------------------------------------------------------------------------------- /pic/fabric_docker_images.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/fabric_docker_images.png -------------------------------------------------------------------------------- /pic/fabric_network_setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/fabric_network_setup.png -------------------------------------------------------------------------------- /pic/fabric_tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/fabric_tools.png -------------------------------------------------------------------------------- /pic/fabric_workflow_of_transaction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/fabric_workflow_of_transaction.png -------------------------------------------------------------------------------- /pic/hyperledger_cello.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/hyperledger_cello.png -------------------------------------------------------------------------------- /pic/hyperledger_greenhouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/hyperledger_greenhouse.png -------------------------------------------------------------------------------- /pic/hyperledger_member.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/hyperledger_member.png -------------------------------------------------------------------------------- /pic/learn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/learn.png -------------------------------------------------------------------------------- /pic/make_tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/make_tools.png -------------------------------------------------------------------------------- /pic/payment_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/payment_code.png -------------------------------------------------------------------------------- /pic/project.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/project.jpg -------------------------------------------------------------------------------- /pic/public_key_infrastructure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/public_key_infrastructure.png -------------------------------------------------------------------------------- /pic/qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/qrcode.jpg -------------------------------------------------------------------------------- /pic/query_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/query_network.png -------------------------------------------------------------------------------- /pic/selection_of_technology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/selection_of_technology.png -------------------------------------------------------------------------------- /pic/types_of_blockchain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/pic/types_of_blockchain.png -------------------------------------------------------------------------------- /src/fabric-material/basic-network/.env: -------------------------------------------------------------------------------- 1 | COMPOSE_PROJECT_NAME=net 2 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/README.md: -------------------------------------------------------------------------------- 1 | ## Basic Network Config 2 | 3 | Note that this basic configuration uses pre-generated certificates and 4 | key material, and also has predefined transactions to initialize a 5 | channel named "mychannel". 6 | 7 | To regenerate this material, simply run ``generate.sh``. 8 | 9 | To start the network, run ``start.sh``. 10 | To stop it, run ``stop.sh`` 11 | To completely remove all incriminating evidence of the network 12 | on your system, run ``teardown.sh``. 13 | 14 | This code is written by the Hyperledger Fabric community. Original source code can be found here: (https://github.com/hyperledger/fabric-samples). 15 | 16 | ## Licenses 17 | 18 | Source code is licensed under the Apache License, Version 2.0 (the "License"). You may obtain a copy of the License at 19 | 20 | (http://www.apache.org/licenses/LICENSE-2.0) 21 | 22 | 23 | Creative Commons License
Documentation is licensed under a Creative Commons Attribution 4.0 International License 24 | 25 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/config/channel.tx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/src/fabric-material/basic-network/config/channel.tx -------------------------------------------------------------------------------- /src/fabric-material/basic-network/config/genesis.block: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/src/fabric-material/basic-network/config/genesis.block -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config.yaml: -------------------------------------------------------------------------------- 1 | # Copyright IBM Corp. All Rights Reserved. 2 | # 3 | # SPDX-License-Identifier: Apache-2.0 4 | # 5 | 6 | # --------------------------------------------------------------------------- 7 | # "OrdererOrgs" - Definition of organizations managing orderer nodes 8 | # --------------------------------------------------------------------------- 9 | OrdererOrgs: 10 | # --------------------------------------------------------------------------- 11 | # Orderer 12 | # --------------------------------------------------------------------------- 13 | - Name: Orderer 14 | Domain: example.com 15 | # --------------------------------------------------------------------------- 16 | # "Specs" - See PeerOrgs below for complete description 17 | # --------------------------------------------------------------------------- 18 | Specs: 19 | - Hostname: orderer 20 | # --------------------------------------------------------------------------- 21 | # "PeerOrgs" - Definition of organizations managing peer nodes 22 | # --------------------------------------------------------------------------- 23 | PeerOrgs: 24 | # --------------------------------------------------------------------------- 25 | # Org1 26 | # --------------------------------------------------------------------------- 27 | - Name: Org1 28 | Domain: org1.example.com 29 | # --------------------------------------------------------------------------- 30 | # "Specs" 31 | # --------------------------------------------------------------------------- 32 | # Uncomment this section to enable the explicit definition of hosts in your 33 | # configuration. Most users will want to use Template, below 34 | # 35 | # Specs is an array of Spec entries. Each Spec entry consists of two fields: 36 | # - Hostname: (Required) The desired hostname, sans the domain. 37 | # - CommonName: (Optional) Specifies the template or explicit override for 38 | # the CN. By default, this is the template: 39 | # 40 | # "{{.Hostname}}.{{.Domain}}" 41 | # 42 | # which obtains its values from the Spec.Hostname and 43 | # Org.Domain, respectively. 44 | # --------------------------------------------------------------------------- 45 | # Specs: 46 | # - Hostname: foo # implicitly "foo.org1.example.com" 47 | # CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above 48 | # - Hostname: bar 49 | # - Hostname: baz 50 | # --------------------------------------------------------------------------- 51 | # "Template" 52 | # --------------------------------------------------------------------------- 53 | # Allows for the definition of 1 or more hosts that are created sequentially 54 | # from a template. By default, this looks like "peer%d" from 0 to Count-1. 55 | # You may override the number of nodes (Count), the starting index (Start) 56 | # or the template used to construct the name (Hostname). 57 | # 58 | # Note: Template and Specs are not mutually exclusive. You may define both 59 | # sections and the aggregate nodes will be created for you. Take care with 60 | # name collisions 61 | # --------------------------------------------------------------------------- 62 | Template: 63 | Count: 1 64 | # Start: 5 65 | # Hostname: {{.Prefix}}{{.Index}} # default 66 | # --------------------------------------------------------------------------- 67 | # "Users" 68 | # --------------------------------------------------------------------------- 69 | # Count: The number of user accounts _in addition_ to Admin 70 | # --------------------------------------------------------------------------- 71 | Users: 72 | Count: 1 73 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/ca/a0606a4a860a1e31c90a23788da6f3b6b74925ed0d23061af4899409ba46ae6a_sk: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgbIRfBJjk/t3HLnEz 3 | 32V4sCllmJtnliVv4UmLfrjZ+B6hRANCAASM01iiFoDgTsTd27nU+R1z7YZbqM4I 4 | Tlz13Mg+SQWsWn25IM6/IwtzNq5SSQZtJwpo7+gtS5IggDn7WJMi6Hy6 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/ca/ca.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICLjCCAdWgAwIBAgIQHuAANpa/kDL7CPyNttctRjAKBggqhkjOPQQDAjBpMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w 5 | bGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowaTELMAkGA1UE 6 | BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz 7 | Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv 8 | bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIzTWKIWgOBOxN3budT5HXPthluo 9 | zghOXPXcyD5JBaxafbkgzr8jC3M2rlJJBm0nCmjv6C1LkiCAOftYkyLofLqjXzBd 10 | MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB 11 | Af8wKQYDVR0OBCIEIKBgakqGCh4xyQojeI2m87a3SSXtDSMGGvSJlAm6Rq5qMAoG 12 | CCqGSM49BAMCA0cAMEQCIGShwWIKXmf3oJY3Oow7pKA0SSe89UsRLy2HMxxNzgWx 13 | AiB097hBfmM2JEZsEZfMbEM2U7edQIDyCoPOgm5ha9wDNw== 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/msp/admincerts/Admin@example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICCTCCAbCgAwIBAgIQVMXz1cejr3sGgDsXuIBK3zAKBggqhkjOPQQDAjBpMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w 5 | bGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowVjELMAkGA1UE 6 | BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz 7 | Y28xGjAYBgNVBAMMEUFkbWluQGV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZI 8 | zj0DAQcDQgAEFufLmRXBZHc3d7HvYSU4jR4nJnzfmJlWN6Gm0Bm+NsO8lwb1TDa4 9 | cPzAOgnbIm1VFwhBd+sE3TIzIWsM2Kzv1aNNMEswDgYDVR0PAQH/BAQDAgeAMAwG 10 | A1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgoGBqSoYKHjHJCiN4jabztrdJJe0NIwYa 11 | 9ImUCbpGrmowCgYIKoZIzj0EAwIDRwAwRAIgId+xpuBHjfWvL8aAsDbmMjXAoOYy 12 | BgazcJh446kZaDACIDeyvsH5Xwes5w5Sksv7mb6/kr4ceCy00h1Vlt5bwPiu 13 | -----END CERTIFICATE----- 14 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/msp/cacerts/ca.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICLjCCAdWgAwIBAgIQHuAANpa/kDL7CPyNttctRjAKBggqhkjOPQQDAjBpMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w 5 | bGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowaTELMAkGA1UE 6 | BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz 7 | Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv 8 | bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIzTWKIWgOBOxN3budT5HXPthluo 9 | zghOXPXcyD5JBaxafbkgzr8jC3M2rlJJBm0nCmjv6C1LkiCAOftYkyLofLqjXzBd 10 | MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB 11 | Af8wKQYDVR0OBCIEIKBgakqGCh4xyQojeI2m87a3SSXtDSMGGvSJlAm6Rq5qMAoG 12 | CCqGSM49BAMCA0cAMEQCIGShwWIKXmf3oJY3Oow7pKA0SSe89UsRLy2HMxxNzgWx 13 | AiB097hBfmM2JEZsEZfMbEM2U7edQIDyCoPOgm5ha9wDNw== 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICNTCCAdugAwIBAgIQT0WLBisbcQ6AkirTJApb1TAKBggqhkjOPQQDAjBsMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4 5 | YW1wbGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowbDELMAkG 6 | A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu 7 | Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt 8 | cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGtRFSyePgHhit2JfQNn 9 | Gbda3X9Y+Eb5Ft/4L9uLsxc4zEMLt2TJZewEfO/Uoe9YH9VhFmGj/d9M0d/0HSAn 10 | K8WjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB 11 | /wQFMAMBAf8wKQYDVR0OBCIEII0hhlVshdUV5zfQwNqNDXZyeFtoXLUDvLleU9zC 12 | efunMAoGCCqGSM49BAMCA0gAMEUCIQDxLfsMRqPJuoH77vahGkE6EYMqvzjVI2Ob 13 | aV1DZJfUdwIgHuHXPvKvcoYZgAo7Xc57Uqs6hSpMs0CjzcfLXYiwoVc= 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/admincerts/Admin@example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICCTCCAbCgAwIBAgIQVMXz1cejr3sGgDsXuIBK3zAKBggqhkjOPQQDAjBpMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w 5 | bGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowVjELMAkGA1UE 6 | BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz 7 | Y28xGjAYBgNVBAMMEUFkbWluQGV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZI 8 | zj0DAQcDQgAEFufLmRXBZHc3d7HvYSU4jR4nJnzfmJlWN6Gm0Bm+NsO8lwb1TDa4 9 | cPzAOgnbIm1VFwhBd+sE3TIzIWsM2Kzv1aNNMEswDgYDVR0PAQH/BAQDAgeAMAwG 10 | A1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgoGBqSoYKHjHJCiN4jabztrdJJe0NIwYa 11 | 9ImUCbpGrmowCgYIKoZIzj0EAwIDRwAwRAIgId+xpuBHjfWvL8aAsDbmMjXAoOYy 12 | BgazcJh446kZaDACIDeyvsH5Xwes5w5Sksv7mb6/kr4ceCy00h1Vlt5bwPiu 13 | -----END CERTIFICATE----- 14 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICLjCCAdWgAwIBAgIQHuAANpa/kDL7CPyNttctRjAKBggqhkjOPQQDAjBpMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w 5 | bGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowaTELMAkGA1UE 6 | BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz 7 | Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv 8 | bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIzTWKIWgOBOxN3budT5HXPthluo 9 | zghOXPXcyD5JBaxafbkgzr8jC3M2rlJJBm0nCmjv6C1LkiCAOftYkyLofLqjXzBd 10 | MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB 11 | Af8wKQYDVR0OBCIEIKBgakqGCh4xyQojeI2m87a3SSXtDSMGGvSJlAm6Rq5qMAoG 12 | CCqGSM49BAMCA0cAMEQCIGShwWIKXmf3oJY3Oow7pKA0SSe89UsRLy2HMxxNzgWx 13 | AiB097hBfmM2JEZsEZfMbEM2U7edQIDyCoPOgm5ha9wDNw== 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/keystore/4d2f776c0fef8eac3f460a7c3558dc7859c4fe458e262e674a6c23f242ea33d1_sk: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg730zOAwSLJKj9wle 3 | jbxx4d0P2Qwl314A+znW9n6070mhRANCAARQ4kbOlqzGNLkQmZsUh78a04kkCjqa 4 | EmovJhP08G9VJ1pD9NCUw2WosRmAU/rBz0K2tSn9YOdn8zbMumgM+ORy 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/signcerts/orderer.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICDDCCAbOgAwIBAgIRAK30hdRcBxQJYNPqPkiFo3IwCgYIKoZIzj0EAwIwaTEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt 5 | cGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0MzJaMFgxCzAJBgNV 6 | BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp 7 | c2NvMRwwGgYDVQQDExNvcmRlcmVyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI 8 | KoZIzj0DAQcDQgAEUOJGzpasxjS5EJmbFIe/GtOJJAo6mhJqLyYT9PBvVSdaQ/TQ 9 | lMNlqLEZgFP6wc9CtrUp/WDnZ/M2zLpoDPjkcqNNMEswDgYDVR0PAQH/BAQDAgeA 10 | MAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgoGBqSoYKHjHJCiN4jabztrdJJe0N 11 | IwYa9ImUCbpGrmowCgYIKoZIzj0EAwIDRwAwRAIgHsU1f4jzuul6zYGY/Xn/H5X5 12 | gDe7/u8dZxJfWwXOGNsCICbXt6yezSzacOFQDkvAPz5/3OYI5YKLSTl+Wilfa/qy 13 | -----END CERTIFICATE----- 14 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICNTCCAdugAwIBAgIQT0WLBisbcQ6AkirTJApb1TAKBggqhkjOPQQDAjBsMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4 5 | YW1wbGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowbDELMAkG 6 | A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu 7 | Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt 8 | cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGtRFSyePgHhit2JfQNn 9 | Gbda3X9Y+Eb5Ft/4L9uLsxc4zEMLt2TJZewEfO/Uoe9YH9VhFmGj/d9M0d/0HSAn 10 | K8WjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB 11 | /wQFMAMBAf8wKQYDVR0OBCIEII0hhlVshdUV5zfQwNqNDXZyeFtoXLUDvLleU9zC 12 | efunMAoGCCqGSM49BAMCA0gAMEUCIQDxLfsMRqPJuoH77vahGkE6EYMqvzjVI2Ob 13 | aV1DZJfUdwIgHuHXPvKvcoYZgAo7Xc57Uqs6hSpMs0CjzcfLXYiwoVc= 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICNTCCAdugAwIBAgIQT0WLBisbcQ6AkirTJApb1TAKBggqhkjOPQQDAjBsMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4 5 | YW1wbGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowbDELMAkG 6 | A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu 7 | Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt 8 | cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGtRFSyePgHhit2JfQNn 9 | Gbda3X9Y+Eb5Ft/4L9uLsxc4zEMLt2TJZewEfO/Uoe9YH9VhFmGj/d9M0d/0HSAn 10 | K8WjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB 11 | /wQFMAMBAf8wKQYDVR0OBCIEII0hhlVshdUV5zfQwNqNDXZyeFtoXLUDvLleU9zC 12 | efunMAoGCCqGSM49BAMCA0gAMEUCIQDxLfsMRqPJuoH77vahGkE6EYMqvzjVI2Ob 13 | aV1DZJfUdwIgHuHXPvKvcoYZgAo7Xc57Uqs6hSpMs0CjzcfLXYiwoVc= 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICWTCCAf+gAwIBAgIQLwiilHvhB1gOg5eGs5O9YDAKBggqhkjOPQQDAjBsMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4 5 | YW1wbGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowWDELMAkG 6 | A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu 7 | Y2lzY28xHDAaBgNVBAMTE29yZGVyZXIuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIB 8 | BggqhkjOPQMBBwNCAARYRRq90z+ioUM2U9OzPnvqvz9Jpza9JOEsG6UJyEzWB8R7 9 | bHr0XR1Dl8lodlLh3C5vTrb6vqtpNeVXVsd+VVyIo4GWMIGTMA4GA1UdDwEB/wQE 10 | AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIw 11 | ADArBgNVHSMEJDAigCCNIYZVbIXVFec30MDajQ12cnhbaFy1A7y5XlPcwnn7pzAn 12 | BgNVHREEIDAeghNvcmRlcmVyLmV4YW1wbGUuY29tggdvcmRlcmVyMAoGCCqGSM49 13 | BAMCA0gAMEUCIQDwjzlscwNhuVcxF+FQy3PNwxsSRSOsQqjmFbMFNDSG6wIgfNO0 14 | Mp/QtUShzWepgh1nm8MmDNcnVOOeb4JJy6Gd3Ss= 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgH/whD1mna09pbmG6 3 | txGQVIYDx1pZdM/Bkaq1eWYUZqChRANCAARYRRq90z+ioUM2U9OzPnvqvz9Jpza9 4 | JOEsG6UJyEzWB8R7bHr0XR1Dl8lodlLh3C5vTrb6vqtpNeVXVsd+VVyI 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/tlsca/8d2186556c85d515e737d0c0da8d0d7672785b685cb503bcb95e53dcc279fba7_sk: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg6n+vdmDFdoXHLx81 3 | 4KX5d2rChT+6peumwVy6CK6Vld6hRANCAARrURUsnj4B4YrdiX0DZxm3Wt1/WPhG 4 | +Rbf+C/bi7MXOMxDC7dkyWXsBHzv1KHvWB/VYRZho/3fTNHf9B0gJyvF 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICNTCCAdugAwIBAgIQT0WLBisbcQ6AkirTJApb1TAKBggqhkjOPQQDAjBsMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4 5 | YW1wbGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowbDELMAkG 6 | A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu 7 | Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt 8 | cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGtRFSyePgHhit2JfQNn 9 | Gbda3X9Y+Eb5Ft/4L9uLsxc4zEMLt2TJZewEfO/Uoe9YH9VhFmGj/d9M0d/0HSAn 10 | K8WjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB 11 | /wQFMAMBAf8wKQYDVR0OBCIEII0hhlVshdUV5zfQwNqNDXZyeFtoXLUDvLleU9zC 12 | efunMAoGCCqGSM49BAMCA0gAMEUCIQDxLfsMRqPJuoH77vahGkE6EYMqvzjVI2Ob 13 | aV1DZJfUdwIgHuHXPvKvcoYZgAo7Xc57Uqs6hSpMs0CjzcfLXYiwoVc= 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/admincerts/Admin@example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICCTCCAbCgAwIBAgIQVMXz1cejr3sGgDsXuIBK3zAKBggqhkjOPQQDAjBpMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w 5 | bGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowVjELMAkGA1UE 6 | BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz 7 | Y28xGjAYBgNVBAMMEUFkbWluQGV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZI 8 | zj0DAQcDQgAEFufLmRXBZHc3d7HvYSU4jR4nJnzfmJlWN6Gm0Bm+NsO8lwb1TDa4 9 | cPzAOgnbIm1VFwhBd+sE3TIzIWsM2Kzv1aNNMEswDgYDVR0PAQH/BAQDAgeAMAwG 10 | A1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgoGBqSoYKHjHJCiN4jabztrdJJe0NIwYa 11 | 9ImUCbpGrmowCgYIKoZIzj0EAwIDRwAwRAIgId+xpuBHjfWvL8aAsDbmMjXAoOYy 12 | BgazcJh446kZaDACIDeyvsH5Xwes5w5Sksv7mb6/kr4ceCy00h1Vlt5bwPiu 13 | -----END CERTIFICATE----- 14 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/cacerts/ca.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICLjCCAdWgAwIBAgIQHuAANpa/kDL7CPyNttctRjAKBggqhkjOPQQDAjBpMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w 5 | bGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowaTELMAkGA1UE 6 | BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz 7 | Y28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv 8 | bTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIzTWKIWgOBOxN3budT5HXPthluo 9 | zghOXPXcyD5JBaxafbkgzr8jC3M2rlJJBm0nCmjv6C1LkiCAOftYkyLofLqjXzBd 10 | MA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMB 11 | Af8wKQYDVR0OBCIEIKBgakqGCh4xyQojeI2m87a3SSXtDSMGGvSJlAm6Rq5qMAoG 12 | CCqGSM49BAMCA0cAMEQCIGShwWIKXmf3oJY3Oow7pKA0SSe89UsRLy2HMxxNzgWx 13 | AiB097hBfmM2JEZsEZfMbEM2U7edQIDyCoPOgm5ha9wDNw== 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore/1deeab5433fa6e5f045eb763109d6165268fba153211af1281f00d45f54b1022_sk: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgAKUK8aZ5PJMhPpx4 3 | 7mMQoJaha/3jhprXOSxj83ibaYShRANCAAQW58uZFcFkdzd3se9hJTiNHicmfN+Y 4 | mVY3oabQGb42w7yXBvVMNrhw/MA6CdsibVUXCEF36wTdMjMhawzYrO/V 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts/Admin@example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICCTCCAbCgAwIBAgIQVMXz1cejr3sGgDsXuIBK3zAKBggqhkjOPQQDAjBpMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w 5 | bGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowVjELMAkGA1UE 6 | BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz 7 | Y28xGjAYBgNVBAMMEUFkbWluQGV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZI 8 | zj0DAQcDQgAEFufLmRXBZHc3d7HvYSU4jR4nJnzfmJlWN6Gm0Bm+NsO8lwb1TDa4 9 | cPzAOgnbIm1VFwhBd+sE3TIzIWsM2Kzv1aNNMEswDgYDVR0PAQH/BAQDAgeAMAwG 10 | A1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgoGBqSoYKHjHJCiN4jabztrdJJe0NIwYa 11 | 9ImUCbpGrmowCgYIKoZIzj0EAwIDRwAwRAIgId+xpuBHjfWvL8aAsDbmMjXAoOYy 12 | BgazcJh446kZaDACIDeyvsH5Xwes5w5Sksv7mb6/kr4ceCy00h1Vlt5bwPiu 13 | -----END CERTIFICATE----- 14 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/tlscacerts/tlsca.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICNTCCAdugAwIBAgIQT0WLBisbcQ6AkirTJApb1TAKBggqhkjOPQQDAjBsMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4 5 | YW1wbGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowbDELMAkG 6 | A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu 7 | Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt 8 | cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGtRFSyePgHhit2JfQNn 9 | Gbda3X9Y+Eb5Ft/4L9uLsxc4zEMLt2TJZewEfO/Uoe9YH9VhFmGj/d9M0d/0HSAn 10 | K8WjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB 11 | /wQFMAMBAf8wKQYDVR0OBCIEII0hhlVshdUV5zfQwNqNDXZyeFtoXLUDvLleU9zC 12 | efunMAoGCCqGSM49BAMCA0gAMEUCIQDxLfsMRqPJuoH77vahGkE6EYMqvzjVI2Ob 13 | aV1DZJfUdwIgHuHXPvKvcoYZgAo7Xc57Uqs6hSpMs0CjzcfLXYiwoVc= 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/ca.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICNTCCAdugAwIBAgIQT0WLBisbcQ6AkirTJApb1TAKBggqhkjOPQQDAjBsMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4 5 | YW1wbGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowbDELMAkG 6 | A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu 7 | Y2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5leGFt 8 | cGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGtRFSyePgHhit2JfQNn 9 | Gbda3X9Y+Eb5Ft/4L9uLsxc4zEMLt2TJZewEfO/Uoe9YH9VhFmGj/d9M0d/0HSAn 10 | K8WjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAGBgRVHSUAMA8GA1UdEwEB 11 | /wQFMAMBAf8wKQYDVR0OBCIEII0hhlVshdUV5zfQwNqNDXZyeFtoXLUDvLleU9zC 12 | efunMAoGCCqGSM49BAMCA0gAMEUCIQDxLfsMRqPJuoH77vahGkE6EYMqvzjVI2Ob 13 | aV1DZJfUdwIgHuHXPvKvcoYZgAo7Xc57Uqs6hSpMs0CjzcfLXYiwoVc= 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICKzCCAdKgAwIBAgIQHYv3zMnbbON0eufj3s78FTAKBggqhkjOPQQDAjBsMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xGjAYBgNVBAMTEXRsc2NhLmV4 5 | YW1wbGUuY29tMB4XDTE3MDgzMTA5MTQzMloXDTI3MDgyOTA5MTQzMlowVjELMAkG 6 | A1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFu 7 | Y2lzY28xGjAYBgNVBAMMEUFkbWluQGV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI 8 | KoZIzj0DAQcDQgAEZsLfeA+tjHJJOyxhJOP31uDluC6eCnMBq0LKawBugaoI3vqh 9 | T8ux5ty+ooSJk7EN3pTQa10m0qX/Y7e0J79JL6NsMGowDgYDVR0PAQH/BAQDAgWg 10 | MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMCsG 11 | A1UdIwQkMCKAII0hhlVshdUV5zfQwNqNDXZyeFtoXLUDvLleU9zCefunMAoGCCqG 12 | SM49BAMCA0cAMEQCIEcK5iAxpGN1wtC5w+590RJrLzD7DOzVCUIxAdJp80BUAiA/ 13 | XMFE+lHMJmqeoqmXG14Z/70xmHChlyHxm6lFR2I6gw== 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/tls/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg19ebRLtFBB+n9OCa 3 | KcXLds/nf306mSDnnrA7tlZVjaOhRANCAARmwt94D62Mckk7LGEk4/fW4OW4Lp4K 4 | cwGrQsprAG6Bqgje+qFPy7Hm3L6ihImTsQ3elNBrXSbSpf9jt7Qnv0kv 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/ca/4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_sk: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgYMqNZRu/I7vdcjpm 3 | Tj+O9T4AYXi3MBNW4nzWHJN8nLqhRANCAATNLYBI3trLI/wFhYf+9MpnVb1R/vBF 4 | rbu/43J+R8u4E73sCcx0nRfYCA+dHf22ceuSjq3lMXraorVev5tg4Dc7 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICRDCCAeqgAwIBAgIRAIk/1HQ6XgI0p64PQwvUA3owCgYIKoZIzj0EAwIwczEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh 5 | Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkxNDMy 6 | WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN 7 | U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UE 8 | AxMTY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA 9 | BM0tgEje2ssj/AWFh/70ymdVvVH+8EWtu7/jcn5Hy7gTvewJzHSdF9gID50d/bZx 10 | 65KOreUxetqitV6/m2DgNzujXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG 11 | BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIEI5qg3NdtruuLoM2nAY 12 | UdFFBNMarRst3dusalc2Xkl8MAoGCCqGSM49BAMCA0gAMEUCIQDufxsHbxkSP/y+ 13 | oM2xZGgHL5XSTJVBqBryk1rd08Af6QIgLiAwtR7iKRbf1pKKCkt66MZzItZXC0po 14 | /45uf29T/sc= 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/ca/org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICFzCCAb2gAwIBAgIUJsxqPH1Ife3FDELYpl8B0cjrMmMwCgYIKoZIzj0EAwIw 3 | aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK 4 | EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt 5 | Y2Etc2VydmVyMB4XDTE3MTAxOTA2MjkwMFoXDTMyMTAxNTA2MjkwMFowaDELMAkG 6 | A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl 7 | cmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMtY2Etc2Vy 8 | dmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoIQafHjU13n4UK1zfoGvoWAk 9 | CwuJTy+3wsd/9jqITt1zfpB4+nwvpHI1LDV/3kBxYVT05MYU4oMJXhN/TS7EaqNF 10 | MEMwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYE 11 | FEQdQDuczTptIU31AeZIQne2u2t1MAoGCCqGSM49BAMCA0gAMEUCIQDmvb8MME5u 12 | rcyypylH5+YN9LZANGaRPFjWAWXYmxjAjAIgPT68SDRuWBR9V/uG+JMxpEUPt+Gi 13 | NBw8LSQw6ijIlRk= 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICGDCCAb+gAwIBAgIQFSxnLAGsu04zrFkAEwzn6zAKBggqhkjOPQQDAjBzMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu 5 | b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0MzJa 6 | MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T 7 | YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29tMFkw 8 | EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEV1dfmKxsFKWo7o6DNBIaIVebCCPAM9C/ 9 | sLBt4pJRre9pWE987DjXZoZ3glc4+DoPMtTmBRqbPVwYcUvpbYY8p6NNMEswDgYD 10 | VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgQjmqDc122u64 11 | ugzacBhR0UUE0xqtGy3d26xqVzZeSXwwCgYIKoZIzj0EAwIDRwAwRAIgXMy26AEU 12 | /GUMPfCMs/nQjQME1ZxBHAYZtKEuRR361JsCIEg9BOZdIoioRivJC+ZUzvJUnkXu 13 | o2HkWiuxLsibGxtE 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICRDCCAeqgAwIBAgIRAIk/1HQ6XgI0p64PQwvUA3owCgYIKoZIzj0EAwIwczEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh 5 | Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkxNDMy 6 | WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN 7 | U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UE 8 | AxMTY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA 9 | BM0tgEje2ssj/AWFh/70ymdVvVH+8EWtu7/jcn5Hy7gTvewJzHSdF9gID50d/bZx 10 | 65KOreUxetqitV6/m2DgNzujXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG 11 | BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIEI5qg3NdtruuLoM2nAY 12 | UdFFBNMarRst3dusalc2Xkl8MAoGCCqGSM49BAMCA0gAMEUCIQDufxsHbxkSP/y+ 13 | oM2xZGgHL5XSTJVBqBryk1rd08Af6QIgLiAwtR7iKRbf1pKKCkt66MZzItZXC0po 14 | /45uf29T/sc= 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICSTCCAfCgAwIBAgIRALOo7o5dtcd8yGpCqowtoIUwCgYIKoZIzj0EAwIwdjEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs 5 | c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkx 6 | NDMyWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE 7 | BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G 8 | A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49 9 | AwEHA0IABAftdw28/JThHyrfF4SCTjHUykfeQZ3eqSwYlkCqYF1Lwzae18o97Biz 10 | doz/BBMjisAoJESyzVOrGj7nGD7EzwWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV 11 | HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIO0/2COT6V/C 12 | xHWvwRPI0sWR90XRurxNbZzOChrMForLMAoGCCqGSM49BAMCA0cAMEQCIGd4ZaLj 13 | 1R4C25obVTI/pWriqWlXXAV7h2ZQfD41nNMYAiAO858VYb4xyLUkF9XGtZJpux4x 14 | 0ClsWNgEp49nBBsecw== 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICGDCCAb+gAwIBAgIQFSxnLAGsu04zrFkAEwzn6zAKBggqhkjOPQQDAjBzMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu 5 | b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0MzJa 6 | MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T 7 | YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29tMFkw 8 | EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEV1dfmKxsFKWo7o6DNBIaIVebCCPAM9C/ 9 | sLBt4pJRre9pWE987DjXZoZ3glc4+DoPMtTmBRqbPVwYcUvpbYY8p6NNMEswDgYD 10 | VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgQjmqDc122u64 11 | ugzacBhR0UUE0xqtGy3d26xqVzZeSXwwCgYIKoZIzj0EAwIDRwAwRAIgXMy26AEU 12 | /GUMPfCMs/nQjQME1ZxBHAYZtKEuRR361JsCIEg9BOZdIoioRivJC+ZUzvJUnkXu 13 | o2HkWiuxLsibGxtE 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICRDCCAeqgAwIBAgIRAIk/1HQ6XgI0p64PQwvUA3owCgYIKoZIzj0EAwIwczEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh 5 | Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkxNDMy 6 | WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN 7 | U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UE 8 | AxMTY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA 9 | BM0tgEje2ssj/AWFh/70ymdVvVH+8EWtu7/jcn5Hy7gTvewJzHSdF9gID50d/bZx 10 | 65KOreUxetqitV6/m2DgNzujXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG 11 | BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIEI5qg3NdtruuLoM2nAY 12 | UdFFBNMarRst3dusalc2Xkl8MAoGCCqGSM49BAMCA0gAMEUCIQDufxsHbxkSP/y+ 13 | oM2xZGgHL5XSTJVBqBryk1rd08Af6QIgLiAwtR7iKRbf1pKKCkt66MZzItZXC0po 14 | /45uf29T/sc= 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/keystore/46be1d569fe68f33e517c9e0072a0ccfbfb42727480fb8c8d0223af321a7893d_sk: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg46tw2jZtucld26uq 3 | RQAPPB1+y8BilJU2luj/OsMinWahRANCAAR4ocVupLNwdvuV3WwFatwgYMUUUWdt 4 | sc86apw/OpypM+3wRJQboZV5diuq08cmNjgTgdLbPJHqmfd8bnkRspq2 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/signcerts/peer0.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICGjCCAcCgAwIBAgIRAPlwF/rUZUP9mqN4wSml4iswCgYIKoZIzj0EAwIwczEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh 5 | Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkxNDMy 6 | WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN 7 | U2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMS5leGFtcGxlLmNvbTBZ 8 | MBMGByqGSM49AgEGCCqGSM49AwEHA0IABHihxW6ks3B2+5XdbAVq3CBgxRRRZ22x 9 | zzpqnD86nKkz7fBElBuhlXl2K6rTxyY2OBOB0ts8keqZ93xueRGymrajTTBLMA4G 10 | A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIEI5qg3Ndtru 11 | uLoM2nAYUdFFBNMarRst3dusalc2Xkl8MAoGCCqGSM49BAMCA0gAMEUCIQD4j0Rn 12 | e1rrd0FSCzsR6u+IuuPK5dI/kR/bh7+VLf0TNgIgCfUtkJvfvzVEwZLFoFyjoHtr 13 | tvwzNUS1U0hEqIaDeo4= 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICSTCCAfCgAwIBAgIRALOo7o5dtcd8yGpCqowtoIUwCgYIKoZIzj0EAwIwdjEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs 5 | c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkx 6 | NDMyWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE 7 | BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G 8 | A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49 9 | AwEHA0IABAftdw28/JThHyrfF4SCTjHUykfeQZ3eqSwYlkCqYF1Lwzae18o97Biz 10 | doz/BBMjisAoJESyzVOrGj7nGD7EzwWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV 11 | HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIO0/2COT6V/C 12 | xHWvwRPI0sWR90XRurxNbZzOChrMForLMAoGCCqGSM49BAMCA0cAMEQCIGd4ZaLj 13 | 1R4C25obVTI/pWriqWlXXAV7h2ZQfD41nNMYAiAO858VYb4xyLUkF9XGtZJpux4x 14 | 0ClsWNgEp49nBBsecw== 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICSTCCAfCgAwIBAgIRALOo7o5dtcd8yGpCqowtoIUwCgYIKoZIzj0EAwIwdjEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs 5 | c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkx 6 | NDMyWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE 7 | BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G 8 | A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49 9 | AwEHA0IABAftdw28/JThHyrfF4SCTjHUykfeQZ3eqSwYlkCqYF1Lwzae18o97Biz 10 | doz/BBMjisAoJESyzVOrGj7nGD7EzwWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV 11 | HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIO0/2COT6V/C 12 | xHWvwRPI0sWR90XRurxNbZzOChrMForLMAoGCCqGSM49BAMCA0cAMEQCIGd4ZaLj 13 | 1R4C25obVTI/pWriqWlXXAV7h2ZQfD41nNMYAiAO858VYb4xyLUkF9XGtZJpux4x 14 | 0ClsWNgEp49nBBsecw== 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICZjCCAg2gAwIBAgIQenbZk7+46tsIJy8JAgySaDAKBggqhkjOPQQDAjB2MQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz 5 | Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0 6 | MzJaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH 7 | Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDExZwZWVyMC5vcmcxLmV4YW1wbGUuY29t 8 | MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0AZOhWRZ4aOZeLSBioClHt5VDiNT 9 | CeIxn3rVw9oCzlDDMaIZrBG1lI4o2tXOgOGSIPBmRjy736Njc54InlHlsKOBlzCB 10 | lDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC 11 | MAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAg7T/YI5PpX8LEda/BE8jSxZH3RdG6 12 | vE1tnM4KGswWisswKAYDVR0RBCEwH4IWcGVlcjAub3JnMS5leGFtcGxlLmNvbYIF 13 | cGVlcjAwCgYIKoZIzj0EAwIDRwAwRAIgU9GgYioYa1Mdhhe5MHyZGXfr4G8gBxwe 14 | dqlWU/mGaPsCIGQpA0VoBrP3Neso3htfZnlWKcbrtCD29HBWmT7ImZT1 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMvwKsTL9m2NygrLw 3 | dfrlMzyQlUaSPendFhF+2yLGaH2hRANCAATQBk6FZFnho5l4tIGKgKUe3lUOI1MJ 4 | 4jGfetXD2gLOUMMxohmsEbWUjija1c6A4ZIg8GZGPLvfo2NzngieUeWw 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/tlsca/ed3fd82393e95fc2c475afc113c8d2c591f745d1babc4d6d9cce0a1acc168acb_sk: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgkcI0vNVNanWltD+I 3 | VHz5V1u01+X8VOG3a5ZTLRed0MmhRANCAAQH7XcNvPyU4R8q3xeEgk4x1MpH3kGd 4 | 3qksGJZAqmBdS8M2ntfKPewYs3aM/wQTI4rAKCREss1Tqxo+5xg+xM8F 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICSTCCAfCgAwIBAgIRALOo7o5dtcd8yGpCqowtoIUwCgYIKoZIzj0EAwIwdjEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs 5 | c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkx 6 | NDMyWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE 7 | BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G 8 | A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49 9 | AwEHA0IABAftdw28/JThHyrfF4SCTjHUykfeQZ3eqSwYlkCqYF1Lwzae18o97Biz 10 | doz/BBMjisAoJESyzVOrGj7nGD7EzwWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV 11 | HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIO0/2COT6V/C 12 | xHWvwRPI0sWR90XRurxNbZzOChrMForLMAoGCCqGSM49BAMCA0cAMEQCIGd4ZaLj 13 | 1R4C25obVTI/pWriqWlXXAV7h2ZQfD41nNMYAiAO858VYb4xyLUkF9XGtZJpux4x 14 | 0ClsWNgEp49nBBsecw== 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICGDCCAb+gAwIBAgIQFSxnLAGsu04zrFkAEwzn6zAKBggqhkjOPQQDAjBzMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu 5 | b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0MzJa 6 | MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T 7 | YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29tMFkw 8 | EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEV1dfmKxsFKWo7o6DNBIaIVebCCPAM9C/ 9 | sLBt4pJRre9pWE987DjXZoZ3glc4+DoPMtTmBRqbPVwYcUvpbYY8p6NNMEswDgYD 10 | VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgQjmqDc122u64 11 | ugzacBhR0UUE0xqtGy3d26xqVzZeSXwwCgYIKoZIzj0EAwIDRwAwRAIgXMy26AEU 12 | /GUMPfCMs/nQjQME1ZxBHAYZtKEuRR361JsCIEg9BOZdIoioRivJC+ZUzvJUnkXu 13 | o2HkWiuxLsibGxtE 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICRDCCAeqgAwIBAgIRAIk/1HQ6XgI0p64PQwvUA3owCgYIKoZIzj0EAwIwczEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh 5 | Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkxNDMy 6 | WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN 7 | U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UE 8 | AxMTY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA 9 | BM0tgEje2ssj/AWFh/70ymdVvVH+8EWtu7/jcn5Hy7gTvewJzHSdF9gID50d/bZx 10 | 65KOreUxetqitV6/m2DgNzujXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG 11 | BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIEI5qg3NdtruuLoM2nAY 12 | UdFFBNMarRst3dusalc2Xkl8MAoGCCqGSM49BAMCA0gAMEUCIQDufxsHbxkSP/y+ 13 | oM2xZGgHL5XSTJVBqBryk1rd08Af6QIgLiAwtR7iKRbf1pKKCkt66MZzItZXC0po 14 | /45uf29T/sc= 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/cd96d5260ad4757551ed4a5a991e62130f8008a0bf996e4e4b84cd097a747fec_sk: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgRgQr347ij6cjwX7m 3 | KjzbbD8Tlwdfu6FaubjWJWLGyqahRANCAARXV1+YrGwUpajujoM0EhohV5sII8Az 4 | 0L+wsG3iklGt72lYT3zsONdmhneCVzj4Og8y1OYFGps9XBhxS+lthjyn 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICGDCCAb+gAwIBAgIQFSxnLAGsu04zrFkAEwzn6zAKBggqhkjOPQQDAjBzMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu 5 | b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0MzJa 6 | MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T 7 | YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29tMFkw 8 | EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEV1dfmKxsFKWo7o6DNBIaIVebCCPAM9C/ 9 | sLBt4pJRre9pWE987DjXZoZ3glc4+DoPMtTmBRqbPVwYcUvpbYY8p6NNMEswDgYD 10 | VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgQjmqDc122u64 11 | ugzacBhR0UUE0xqtGy3d26xqVzZeSXwwCgYIKoZIzj0EAwIDRwAwRAIgXMy26AEU 12 | /GUMPfCMs/nQjQME1ZxBHAYZtKEuRR361JsCIEg9BOZdIoioRivJC+ZUzvJUnkXu 13 | o2HkWiuxLsibGxtE 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICSTCCAfCgAwIBAgIRALOo7o5dtcd8yGpCqowtoIUwCgYIKoZIzj0EAwIwdjEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs 5 | c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkx 6 | NDMyWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE 7 | BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G 8 | A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49 9 | AwEHA0IABAftdw28/JThHyrfF4SCTjHUykfeQZ3eqSwYlkCqYF1Lwzae18o97Biz 10 | doz/BBMjisAoJESyzVOrGj7nGD7EzwWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV 11 | HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIO0/2COT6V/C 12 | xHWvwRPI0sWR90XRurxNbZzOChrMForLMAoGCCqGSM49BAMCA0cAMEQCIGd4ZaLj 13 | 1R4C25obVTI/pWriqWlXXAV7h2ZQfD41nNMYAiAO858VYb4xyLUkF9XGtZJpux4x 14 | 0ClsWNgEp49nBBsecw== 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/ca.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICSTCCAfCgAwIBAgIRALOo7o5dtcd8yGpCqowtoIUwCgYIKoZIzj0EAwIwdjEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs 5 | c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkx 6 | NDMyWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE 7 | BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G 8 | A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49 9 | AwEHA0IABAftdw28/JThHyrfF4SCTjHUykfeQZ3eqSwYlkCqYF1Lwzae18o97Biz 10 | doz/BBMjisAoJESyzVOrGj7nGD7EzwWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV 11 | HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIO0/2COT6V/C 12 | xHWvwRPI0sWR90XRurxNbZzOChrMForLMAoGCCqGSM49BAMCA0cAMEQCIGd4ZaLj 13 | 1R4C25obVTI/pWriqWlXXAV7h2ZQfD41nNMYAiAO858VYb4xyLUkF9XGtZJpux4x 14 | 0ClsWNgEp49nBBsecw== 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICOjCCAeGgAwIBAgIQZbszPe722f2AcfnwpG2ENDAKBggqhkjOPQQDAjB2MQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz 5 | Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0 6 | MzJaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH 7 | Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZBZG1pbkBvcmcxLmV4YW1wbGUuY29t 8 | MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5ZfQwNA0oBGCr7zX4I/Ufq1Ht740 9 | RnkV+6VBceaG4x45bR0a0ZWeslPzmIRXOir9QvqLvnxGY3aJiadX65kNFKNsMGow 10 | DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM 11 | BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIO0/2COT6V/CxHWvwRPI0sWR90XRurxN 12 | bZzOChrMForLMAoGCCqGSM49BAMCA0cAMEQCIF2V2t75M9bgjQ3pktVEYnCS4u0S 13 | Izw6ZNSy8q/i6C6cAiB4V0ejzQYtp5C25F2xMD+JSlwrhBAOJNK1AkTzj9mgWg== 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/tls/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgqAuu2rihnWgQDlHI 3 | 7Gqyn+Bap3mMqbJ7UQLXIT6lwtmhRANCAATll9DA0DSgEYKvvNfgj9R+rUe3vjRG 4 | eRX7pUFx5objHjltHRrRlZ6yU/OYhFc6Kv1C+ou+fEZjdomJp1frmQ0U 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/admincerts/User1@org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICGTCCAb+gAwIBAgIQPyhm+v0ZIqCo6MATzLc+5jAKBggqhkjOPQQDAjBzMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu 5 | b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0MzJa 6 | MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T 7 | YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZVc2VyMUBvcmcxLmV4YW1wbGUuY29tMFkw 8 | EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEL/SomNVO3R5nnsemQ4im/UUZ8Ixs7/nH 9 | 3NH1ROfVJ+m7niDf1ZmhvTyiJzrUpI+n5+/OKIX/Z/VhDuAIR/QLLKNNMEswDgYD 10 | VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgQjmqDc122u64 11 | ugzacBhR0UUE0xqtGy3d26xqVzZeSXwwCgYIKoZIzj0EAwIDSAAwRQIhAJk63AHS 12 | CEvJh64Yx5CnWDgDYNoj0jsi+gGheIxbUYgMAiAi/qPG7KEuuDBL4LlZRfkeatMW 13 | ZKPD7ikt+vOYgVnqlA== 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICRDCCAeqgAwIBAgIRAIk/1HQ6XgI0p64PQwvUA3owCgYIKoZIzj0EAwIwczEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh 5 | Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkxNDMy 6 | WjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN 7 | U2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UE 8 | AxMTY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA 9 | BM0tgEje2ssj/AWFh/70ymdVvVH+8EWtu7/jcn5Hy7gTvewJzHSdF9gID50d/bZx 10 | 65KOreUxetqitV6/m2DgNzujXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNVHSUECDAG 11 | BgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIEI5qg3NdtruuLoM2nAY 12 | UdFFBNMarRst3dusalc2Xkl8MAoGCCqGSM49BAMCA0gAMEUCIQDufxsHbxkSP/y+ 13 | oM2xZGgHL5XSTJVBqBryk1rd08Af6QIgLiAwtR7iKRbf1pKKCkt66MZzItZXC0po 14 | /45uf29T/sc= 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/c75bd6911aca808941c3557ee7c97e90f3952e379497dc55eb903f31b50abc83_sk: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgJ8IrEgxfZzjGsyt+ 3 | 0o27jvhwUJE2W1PrFeZi8LwHbiuhRANCAAQv9KiY1U7dHmeex6ZDiKb9RRnwjGzv 4 | +cfc0fVE59Un6bueIN/VmaG9PKInOtSkj6fn784ohf9n9WEO4AhH9Ass 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICGTCCAb+gAwIBAgIQPyhm+v0ZIqCo6MATzLc+5jAKBggqhkjOPQQDAjBzMQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu 5 | b3JnMS5leGFtcGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0MzJa 6 | MFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T 7 | YW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZVc2VyMUBvcmcxLmV4YW1wbGUuY29tMFkw 8 | EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEL/SomNVO3R5nnsemQ4im/UUZ8Ixs7/nH 9 | 3NH1ROfVJ+m7niDf1ZmhvTyiJzrUpI+n5+/OKIX/Z/VhDuAIR/QLLKNNMEswDgYD 10 | VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgQjmqDc122u64 11 | ugzacBhR0UUE0xqtGy3d26xqVzZeSXwwCgYIKoZIzj0EAwIDSAAwRQIhAJk63AHS 12 | CEvJh64Yx5CnWDgDYNoj0jsi+gGheIxbUYgMAiAi/qPG7KEuuDBL4LlZRfkeatMW 13 | ZKPD7ikt+vOYgVnqlA== 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICSTCCAfCgAwIBAgIRALOo7o5dtcd8yGpCqowtoIUwCgYIKoZIzj0EAwIwdjEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs 5 | c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkx 6 | NDMyWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE 7 | BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G 8 | A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49 9 | AwEHA0IABAftdw28/JThHyrfF4SCTjHUykfeQZ3eqSwYlkCqYF1Lwzae18o97Biz 10 | doz/BBMjisAoJESyzVOrGj7nGD7EzwWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV 11 | HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIO0/2COT6V/C 12 | xHWvwRPI0sWR90XRurxNbZzOChrMForLMAoGCCqGSM49BAMCA0cAMEQCIGd4ZaLj 13 | 1R4C25obVTI/pWriqWlXXAV7h2ZQfD41nNMYAiAO858VYb4xyLUkF9XGtZJpux4x 14 | 0ClsWNgEp49nBBsecw== 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/ca.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICSTCCAfCgAwIBAgIRALOo7o5dtcd8yGpCqowtoIUwCgYIKoZIzj0EAwIwdjEL 3 | MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG 4 | cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRs 5 | c2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwODMxMDkxNDMyWhcNMjcwODI5MDkx 6 | NDMyWjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE 7 | BxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0G 8 | A1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49 9 | AwEHA0IABAftdw28/JThHyrfF4SCTjHUykfeQZ3eqSwYlkCqYF1Lwzae18o97Biz 10 | doz/BBMjisAoJESyzVOrGj7nGD7EzwWjXzBdMA4GA1UdDwEB/wQEAwIBpjAPBgNV 11 | HSUECDAGBgRVHSUAMA8GA1UdEwEB/wQFMAMBAf8wKQYDVR0OBCIEIO0/2COT6V/C 12 | xHWvwRPI0sWR90XRurxNbZzOChrMForLMAoGCCqGSM49BAMCA0cAMEQCIGd4ZaLj 13 | 1R4C25obVTI/pWriqWlXXAV7h2ZQfD41nNMYAiAO858VYb4xyLUkF9XGtZJpux4x 14 | 0ClsWNgEp49nBBsecw== 15 | -----END CERTIFICATE----- 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICOzCCAeGgAwIBAgIQat+rcnuTNMrNDQULaEwq7zAKBggqhkjOPQQDAjB2MQsw 3 | CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 4 | YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz 5 | Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xNzA4MzEwOTE0MzJaFw0yNzA4MjkwOTE0 6 | MzJaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH 7 | Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDDBZVc2VyMUBvcmcxLmV4YW1wbGUuY29t 8 | MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFcqqFuh5CXSij4Ma6/tySXB9hYZn 9 | 2oFaVJWPn0JIhqj8rl9vHuNzgwoI1ZNR9fKGmrovqaZjcSg87jxh7gZSeaNsMGow 10 | DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM 11 | BgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIO0/2COT6V/CxHWvwRPI0sWR90XRurxN 12 | bZzOChrMForLMAoGCCqGSM49BAMCA0gAMEUCIQCWp1joCFbOhXbZ2sPW1e6gJBNG 13 | ZK+JY6Lm0bGk4vBk6QIgLQ5nzPRWHJNRaqIbigk0OLBKQtzv/Nfbsi6DnhNQoZU= 14 | -----END CERTIFICATE----- 15 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgf8ybpxd0cfNqWnfX 3 | KRoa6e/hEJGs0zMCkE+5si/xuV+hRANCAAQVyqoW6HkJdKKPgxrr+3JJcH2Fhmfa 4 | gVpUlY+fQkiGqPyuX28e43ODCgjVk1H18oaaui+ppmNxKDzuPGHuBlJ5 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/generate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Copyright IBM Corp All Rights Reserved 4 | # 5 | # SPDX-License-Identifier: Apache-2.0 6 | # 7 | export PATH=$GOPATH/src/github.com/hyperledger/fabric/build/bin:${PWD}/../bin:${PWD}:$PATH 8 | export FABRIC_CFG_PATH=${PWD} 9 | CHANNEL_NAME=mychannel 10 | 11 | # remove previous crypto material and config transactions 12 | rm -fr config/* 13 | rm -fr crypto-config/* 14 | 15 | # generate crypto material 16 | cryptogen generate --config=./crypto-config.yaml 17 | if [ "$?" -ne 0 ]; then 18 | echo "Failed to generate crypto material..." 19 | exit 1 20 | fi 21 | 22 | # generate genesis block for orderer 23 | configtxgen -profile OneOrgOrdererGenesis -outputBlock ./config/genesis.block 24 | if [ "$?" -ne 0 ]; then 25 | echo "Failed to generate orderer genesis block..." 26 | exit 1 27 | fi 28 | 29 | # generate channel configuration transaction 30 | configtxgen -profile OneOrgChannel -outputCreateChannelTx ./config/channel.tx -channelID $CHANNEL_NAME 31 | if [ "$?" -ne 0 ]; then 32 | echo "Failed to generate channel configuration transaction..." 33 | exit 1 34 | fi 35 | 36 | # generate anchor peer transaction 37 | configtxgen -profile OneOrgChannel -outputAnchorPeersUpdate ./config/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP 38 | if [ "$?" -ne 0 ]; then 39 | echo "Failed to generate anchor peer update for Org1MSP..." 40 | exit 1 41 | fi 42 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright IBM Corp All Rights Reserved 4 | # 5 | # SPDX-License-Identifier: Apache-2.0 6 | # 7 | 8 | # Exit on first error, print all commands. 9 | set -ev 10 | # delete previous creds 11 | rm -rf ~/.hfc-key-store/* 12 | 13 | # copy peer admin credentials into the keyValStore 14 | mkdir -p ~/.hfc-key-store 15 | cp creds/* ~/.hfc-key-store 16 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright IBM Corp All Rights Reserved 4 | # 5 | # SPDX-License-Identifier: Apache-2.0 6 | # 7 | # Exit on first error, print all commands. 8 | set -ev 9 | 10 | # don't rewrite paths for Windows Git Bash users 11 | export MSYS_NO_PATHCONV=1 12 | 13 | docker-compose -f docker-compose.yml down 14 | 15 | docker-compose -f docker-compose.yml up -d ca.example.com orderer.example.com peer0.org1.example.com couchdb 16 | 17 | # wait for Hyperledger Fabric to start 18 | # incase of errors when running later commands, issue export FABRIC_START_TIMEOUT= 19 | export FABRIC_START_TIMEOUT=10 20 | #echo ${FABRIC_START_TIMEOUT} 21 | sleep ${FABRIC_START_TIMEOUT} 22 | 23 | # Create the channel 24 | docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx 25 | # Join peer0.org1.example.com to the channel. 26 | docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com peer channel join -b mychannel.block 27 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/stop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright IBM Corp All Rights Reserved 4 | # 5 | # SPDX-License-Identifier: Apache-2.0 6 | # 7 | # Exit on first error, print all commands. 8 | set -ev 9 | 10 | # Shut down the Docker containers that might be currently running. 11 | docker-compose -f docker-compose.yml stop 12 | -------------------------------------------------------------------------------- /src/fabric-material/basic-network/teardown.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright IBM Corp All Rights Reserved 4 | # 5 | # SPDX-License-Identifier: Apache-2.0 6 | # 7 | # Exit on first error, print all commands. 8 | set -e 9 | 10 | # Shut down the Docker containers for the system tests. 11 | docker-compose -f docker-compose.yml kill && docker-compose -f docker-compose.yml down 12 | 13 | # remove the local state 14 | rm -f ~/.hfc-key-store/* 15 | 16 | # remove chaincode docker images 17 | docker rmi $(docker images dev-* -q) 18 | 19 | # Your system is now clean 20 | -------------------------------------------------------------------------------- /src/fabric-material/chaincode/sample-chaincode.go: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: Apache-2.0 2 | 3 | // Import dependencies 4 | // Import the chaincode shim package and the peer protobuf package 5 | 6 | /* This code is based on code written by the Hyperledger Fabric community. 7 | Original code can be found here: https://github.com/hyperledger/fabric-samples/blob/release/chaincode/chaincode_example02/chaincode_example02.go 8 | */ 9 | 10 | package main 11 | 12 | import ( 13 | "fmt" 14 | 15 | "github.com/hyperledger/fabric/core/chaincode/shim" 16 | "github.com/hyperledger/fabric/protos/peer" 17 | ) 18 | 19 | // SampleChaincode implements a simple chaincode to manage an asset 20 | type SampleChaincode struct { 21 | 22 | } 23 | 24 | // Init is called during chaincode instantiation to initialize 25 | // data. We'll be adding more in this function later on. 26 | func (t *SampleChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response { 27 | // Get the args from the transaction proposal 28 | args := stub.GetStringArgs() 29 | if len(args) != 2 { 30 | return shim.Error("Incorrect arguments. Expecting a key and a value") 31 | } 32 | 33 | // Set up any variables or assets here by calling stub.PutState() 34 | 35 | // We store the key and the value on the ledger 36 | err := stub.PutState(args[0], []byte(args[1])) 37 | if err != nil { 38 | return shim.Error(fmt.Sprintf("Failed to create asset: %s", args[0])) 39 | } 40 | return shim.Success(nil) 41 | } 42 | 43 | // Invoke is called per transaction on the chaincode. Each transaction is 44 | // either a 'get' or a 'set' on the asset created by Init function. The Set 45 | // method may create a new asset by specifying a new key-value pair. 46 | func (t *SampleChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response { 47 | // Extract the function and args from the transaction proposal 48 | fn, args := stub.GetFunctionAndParameters() 49 | 50 | var result string 51 | var err error 52 | if fn == "set" { 53 | result, err = set(stub, args) 54 | } else { // assume 'get' even if fn is nil 55 | result, err = get(stub, args) 56 | } 57 | if err != nil { 58 | return shim.Error(err.Error()) 59 | } 60 | 61 | // Return the result as success payload 62 | return shim.Success([]byte(result)) 63 | } 64 | 65 | // Set stores the asset (both key and value) on the ledger. If the key exists, 66 | // it will override the value with the new one 67 | func set(stub shim.ChaincodeStubInterface, args []string) (string, error) { 68 | if len(args) != 2 { 69 | return "", fmt.Errorf("Incorrect arguments. Expecting a key and a value") 70 | } 71 | 72 | err := stub.PutState(args[0], []byte(args[1])) 73 | if err != nil { 74 | return "", fmt.Errorf("Failed to set asset: %s", args[0]) 75 | } 76 | return args[1], nil 77 | } 78 | 79 | // Get returns the value of the specified asset key 80 | func get(stub shim.ChaincodeStubInterface, args []string) (string, error) { 81 | if len(args) != 1 { 82 | return "", fmt.Errorf("Incorrect arguments. Expecting a key") 83 | } 84 | 85 | value, err := stub.GetState(args[0]) 86 | if err != nil { 87 | return "", fmt.Errorf("Failed to get asset: %s with error: %s", args[0], err) 88 | } 89 | if value == nil { 90 | return "", fmt.Errorf("Asset not found: %s", args[0]) 91 | } 92 | return string(value), nil 93 | } 94 | 95 | // main function starts up the chaincode in the container during instantiate 96 | func main() { 97 | err := shim.Start(new(SampleChaincode)) 98 | if err != nil { 99 | fmt.Println("Could not start SampleChaincode") 100 | } else { 101 | fmt.Println("SampleChaincode successfully started") 102 | } 103 | } -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/client/app.js: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: Apache-2.0 2 | 3 | 'use strict'; 4 | 5 | var app = angular.module('application', []); 6 | 7 | // Angular Controller 8 | app.controller('appController', function($scope, appFactory){ 9 | 10 | $("#success_holder").hide(); 11 | $("#success_create").hide(); 12 | $("#error_holder").hide(); 13 | $("#error_query").hide(); 14 | 15 | $scope.queryAllTuna = function(){ 16 | 17 | appFactory.queryAllTuna(function(data){ 18 | var array = []; 19 | for (var i = 0; i < data.length; i++){ 20 | parseInt(data[i].Key); 21 | data[i].Record.Key = parseInt(data[i].Key); 22 | array.push(data[i].Record); 23 | } 24 | array.sort(function(a, b) { 25 | return parseFloat(a.Key) - parseFloat(b.Key); 26 | }); 27 | $scope.all_tuna = array; 28 | }); 29 | } 30 | 31 | $scope.queryTuna = function(){ 32 | 33 | var id = $scope.tuna_id; 34 | 35 | appFactory.queryTuna(id, function(data){ 36 | $scope.query_tuna = data; 37 | }); 38 | } 39 | 40 | $scope.recordTuna = function(){ 41 | 42 | appFactory.recordTuna($scope.tuna, function(data){ 43 | $scope.create_tuna = data; 44 | $("#success_create").show(); 45 | }); 46 | } 47 | 48 | $scope.changeHolder = function(){ 49 | 50 | appFactory.changeHolder($scope.holder, function(data){ 51 | $scope.change_holder = data; 52 | $("#success_holder").show(); 53 | }); 54 | } 55 | 56 | }); 57 | 58 | // Angular Factory 59 | app.factory('appFactory', function($http){ 60 | 61 | var factory = {}; 62 | 63 | factory.queryAllTuna = function(callback){ 64 | 65 | $http.get('/get_all_tuna/').success(function(output){ 66 | callback(output) 67 | }); 68 | } 69 | 70 | factory.queryTuna = function(id, callback){ 71 | $http.get('/get_tuna/'+id).success(function(output){ 72 | callback(output) 73 | }); 74 | } 75 | 76 | factory.recordTuna = function(data, callback){ 77 | 78 | data.location = data.longitude + ", "+ data.latitude; 79 | 80 | var tuna = data.id + "-" + data.location + "-" + data.timestamp + "-" + data.holder + "-" + data.vessel; 81 | 82 | $http.get('/add_tuna/'+tuna).success(function(output){ 83 | callback(output) 84 | }); 85 | } 86 | 87 | factory.changeHolder = function(data, callback){ 88 | 89 | var holder = data.id + "-" + data.name; 90 | 91 | $http.get('/change_holder/'+holder).success(function(output){ 92 | callback(output) 93 | }); 94 | } 95 | 96 | return factory; 97 | }); 98 | -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/client/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yingpingzhang/enterprise_blockchain_tutorial/3b0be2deb509600e3f6666fb30361cf009dd02f8/src/fabric-material/tuna-app/client/favicon.png -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Fabric-tuna-app", 3 | "version": "1.0.0", 4 | "description": "Hyperledger Fabric MOOC Sample Application", 5 | "main": "server.js", 6 | "dependencies": { 7 | "fabric-ca-client": "^1.0.2", 8 | "fabric-client": "^1.0.2", 9 | "grpc": "^1.6.0", 10 | "express": "latest", 11 | "body-parser": "latest", 12 | "ejs": "latest", 13 | "angular": "^1.7.9" 14 | }, 15 | "license": "Apache-2.0", 16 | "keywords": [ 17 | "Hyperledger", 18 | "Fabric", 19 | "Oceans", 20 | "Tuna", 21 | "Fishing", 22 | "Sample", 23 | "Application" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/registerAdmin.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /* 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | /* 6 | * Chaincode Invoke 7 | 8 | This code is based on code written by the Hyperledger Fabric community. 9 | Original code can be found here: https://gerrit.hyperledger.org/r/#/c/14395/4/fabcar/enrollAdmin.js 10 | */ 11 | 12 | var Fabric_Client = require('fabric-client'); 13 | var Fabric_CA_Client = require('fabric-ca-client'); 14 | 15 | var path = require('path'); 16 | var util = require('util'); 17 | var os = require('os'); 18 | 19 | // 20 | var fabric_client = new Fabric_Client(); 21 | var fabric_ca_client = null; 22 | var admin_user = null; 23 | var member_user = null; 24 | var store_path = path.join(os.homedir(), '.hfc-key-store'); 25 | console.log(' Store path:'+store_path); 26 | 27 | // create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting 28 | Fabric_Client.newDefaultKeyValueStore({ path: store_path 29 | }).then((state_store) => { 30 | // assign the store to the fabric client 31 | fabric_client.setStateStore(state_store); 32 | var crypto_suite = Fabric_Client.newCryptoSuite(); 33 | // use the same location for the state store (where the users' certificate are kept) 34 | // and the crypto store (where the users' keys are kept) 35 | var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path}); 36 | crypto_suite.setCryptoKeyStore(crypto_store); 37 | fabric_client.setCryptoSuite(crypto_suite); 38 | var tlsOptions = { 39 | trustedRoots: [], 40 | verify: false 41 | }; 42 | // be sure to change the http to https when the CA is running TLS enabled 43 | fabric_ca_client = new Fabric_CA_Client('http://localhost:7054', tlsOptions , 'ca.example.com', crypto_suite); 44 | 45 | // first check to see if the admin is already enrolled 46 | return fabric_client.getUserContext('admin', true); 47 | }).then((user_from_store) => { 48 | if (user_from_store && user_from_store.isEnrolled()) { 49 | console.log('Successfully loaded admin from persistence'); 50 | admin_user = user_from_store; 51 | return null; 52 | } else { 53 | // need to enroll it with CA server 54 | return fabric_ca_client.enroll({ 55 | enrollmentID: 'admin', 56 | enrollmentSecret: 'adminpw' 57 | }).then((enrollment) => { 58 | console.log('Successfully enrolled admin user "admin"'); 59 | return fabric_client.createUser( 60 | {username: 'admin', 61 | mspid: 'Org1MSP', 62 | cryptoContent: { privateKeyPEM: enrollment.key.toBytes(), signedCertPEM: enrollment.certificate } 63 | }); 64 | }).then((user) => { 65 | admin_user = user; 66 | return fabric_client.setUserContext(admin_user); 67 | }).catch((err) => { 68 | console.error('Failed to enroll and persist admin. Error: ' + err.stack ? err.stack : err); 69 | throw new Error('Failed to enroll admin'); 70 | }); 71 | } 72 | }).then(() => { 73 | console.log('Assigned the admin user to the fabric client ::' + admin_user.toString()); 74 | }).catch((err) => { 75 | console.error('Failed to enroll admin: ' + err); 76 | }); -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/registerUser.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /* 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | /* 6 | * Chaincode Invoke 7 | 8 | This code is based on code written by the Hyperledger Fabric community. 9 | Original code can be found here: https://gerrit.hyperledger.org/r/#/c/14395/4/fabcar/registerUser.js 10 | 11 | */ 12 | 13 | var Fabric_Client = require('fabric-client'); 14 | var Fabric_CA_Client = require('fabric-ca-client'); 15 | 16 | var path = require('path'); 17 | var util = require('util'); 18 | var os = require('os'); 19 | 20 | // 21 | var fabric_client = new Fabric_Client(); 22 | var fabric_ca_client = null; 23 | var admin_user = null; 24 | var member_user = null; 25 | var store_path = path.join(os.homedir(), '.hfc-key-store'); 26 | console.log(' Store path:'+store_path); 27 | 28 | // create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting 29 | Fabric_Client.newDefaultKeyValueStore({ path: store_path 30 | }).then((state_store) => { 31 | // assign the store to the fabric client 32 | fabric_client.setStateStore(state_store); 33 | var crypto_suite = Fabric_Client.newCryptoSuite(); 34 | // use the same location for the state store (where the users' certificate are kept) 35 | // and the crypto store (where the users' keys are kept) 36 | var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path}); 37 | crypto_suite.setCryptoKeyStore(crypto_store); 38 | fabric_client.setCryptoSuite(crypto_suite); 39 | var tlsOptions = { 40 | trustedRoots: [], 41 | verify: false 42 | }; 43 | // be sure to change the http to https when the CA is running TLS enabled 44 | fabric_ca_client = new Fabric_CA_Client('http://localhost:7054', null , '', crypto_suite); 45 | 46 | // first check to see if the admin is already enrolled 47 | return fabric_client.getUserContext('admin', true); 48 | }).then((user_from_store) => { 49 | if (user_from_store && user_from_store.isEnrolled()) { 50 | console.log('Successfully loaded admin from persistence'); 51 | admin_user = user_from_store; 52 | } else { 53 | throw new Error('Failed to get admin.... run registerAdmin.js'); 54 | } 55 | 56 | // at this point we should have the admin user 57 | // first need to register the user with the CA server 58 | return fabric_ca_client.register({enrollmentID: 'user1', affiliation: 'org1.department1'}, admin_user); 59 | }).then((secret) => { 60 | // next we need to enroll the user with CA server 61 | console.log('Successfully registered user1 - secret:'+ secret); 62 | 63 | return fabric_ca_client.enroll({enrollmentID: 'user1', enrollmentSecret: secret}); 64 | }).then((enrollment) => { 65 | console.log('Successfully enrolled member user "user1" '); 66 | return fabric_client.createUser( 67 | {username: 'user1', 68 | mspid: 'Org1MSP', 69 | cryptoContent: { privateKeyPEM: enrollment.key.toBytes(), signedCertPEM: enrollment.certificate } 70 | }); 71 | }).then((user) => { 72 | member_user = user; 73 | 74 | return fabric_client.setUserContext(member_user); 75 | }).then(()=>{ 76 | console.log('User1 was successfully registered and enrolled and is ready to intreact with the fabric network'); 77 | 78 | }).catch((err) => { 79 | console.error('Failed to register: ' + err); 80 | if(err.toString().indexOf('Authorization') > -1) { 81 | console.error('Authorization failures may be caused by having admin credentials from a previous CA instance.\n' + 82 | 'Try again after deleting the contents of the store directory '+store_path); 83 | } 84 | }); -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/routes.js: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: Apache-2.0 2 | 3 | var tuna = require('./controller.js'); 4 | 5 | module.exports = function(app){ 6 | 7 | app.get('/get_tuna/:id', function(req, res){ 8 | tuna.get_tuna(req, res); 9 | }); 10 | app.get('/add_tuna/:tuna', function(req, res){ 11 | tuna.add_tuna(req, res); 12 | }); 13 | app.get('/get_all_tuna', function(req, res){ 14 | tuna.get_all_tuna(req, res); 15 | }); 16 | app.get('/change_holder/:holder', function(req, res){ 17 | tuna.change_holder(req, res); 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/server.js: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: Apache-2.0 2 | 3 | // nodejs server setup 4 | 5 | // call the packages we need 6 | var express = require('express'); // call express 7 | var app = express(); // define our app using express 8 | var bodyParser = require('body-parser'); 9 | var http = require('http') 10 | var fs = require('fs'); 11 | var Fabric_Client = require('fabric-client'); 12 | var path = require('path'); 13 | var util = require('util'); 14 | var os = require('os'); 15 | 16 | // Load all of our middleware 17 | // configure app to use bodyParser() 18 | // this will let us get the data from a POST 19 | // app.use(express.static(__dirname + '/client')); 20 | app.use(bodyParser.urlencoded({ extended: true })); 21 | app.use(bodyParser.json()); 22 | 23 | // instantiate the app 24 | var app = express(); 25 | 26 | // this line requires and runs the code from our routes.js file and passes it app 27 | require('./routes.js')(app); 28 | 29 | // set up a static file server that points to the "client" directory 30 | app.use(express.static(path.join(__dirname, './client'))); 31 | 32 | // Save our port 33 | var port = process.env.PORT || 8000; 34 | 35 | // Start the server and listen on port 36 | app.listen(port,function(){ 37 | console.log("Live on port: " + port); 38 | }); 39 | 40 | -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/src/queryAllTuna.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /* 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | /* 6 | * Hyperledger Fabric Sample Query Program for tuna-app: Chaincode Invoke 7 | 8 | This code is based on code written by the Hyperledger Fabric community. 9 | Original code can be found here: https://github.com/hyperledger/fabric-samples/blob/release/fabcar/query.js 10 | */ 11 | 12 | var Fabric_Client = require('fabric-client'); 13 | var path = require('path'); 14 | var util = require('util'); 15 | var os = require('os'); 16 | 17 | var fabric_client = new Fabric_Client(); 18 | 19 | // setup the fabric network 20 | var channel = fabric_client.newChannel('mychannel'); 21 | var peer = fabric_client.newPeer('grpc://localhost:7051'); 22 | channel.addPeer(peer); 23 | 24 | // 25 | var member_user = null; 26 | var store_path = path.join(os.homedir(), '.hfc-key-store'); 27 | console.log('Store path:'+store_path); 28 | var tx_id = null; 29 | 30 | // create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting 31 | Fabric_Client.newDefaultKeyValueStore({ path: store_path 32 | }).then((state_store) => { 33 | // assign the store to the fabric client 34 | fabric_client.setStateStore(state_store); 35 | var crypto_suite = Fabric_Client.newCryptoSuite(); 36 | // use the same location for the state store (where the users' certificate are kept) 37 | // and the crypto store (where the users' keys are kept) 38 | var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path}); 39 | crypto_suite.setCryptoKeyStore(crypto_store); 40 | fabric_client.setCryptoSuite(crypto_suite); 41 | 42 | // get the enrolled user from persistence, this user will sign all requests 43 | return fabric_client.getUserContext('user1', true); 44 | }).then((user_from_store) => { 45 | if (user_from_store && user_from_store.isEnrolled()) { 46 | console.log('Successfully loaded user1 from persistence'); 47 | member_user = user_from_store; 48 | } else { 49 | throw new Error('Failed to get user1.... run registerUser.js'); 50 | } 51 | 52 | // queryAllTuna - requires no arguments , ex: args: [''], 53 | const request = { 54 | chaincodeId: 'tuna-app', 55 | txId: tx_id, 56 | fcn: 'queryAllTuna', 57 | args: [''] 58 | }; 59 | 60 | // send the query proposal to the peer 61 | return channel.queryByChaincode(request); 62 | }).then((query_responses) => { 63 | console.log("Query has completed, checking results"); 64 | // query_responses could have more than one results if there multiple peers were used as targets 65 | if (query_responses && query_responses.length == 1) { 66 | if (query_responses[0] instanceof Error) { 67 | console.error("error from query = ", query_responses[0]); 68 | } else { 69 | console.log("Response is ", query_responses[0].toString()); 70 | res.json(JSON.parse(query_responses[0].toString())); 71 | } 72 | } else { 73 | console.log("No payloads were returned from query"); 74 | } 75 | }).catch((err) => { 76 | console.error('Failed to query successfully :: ' + err); 77 | }); 78 | -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/src/queryTuna.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /* 3 | * SPDX-License-Identifier: Apache-2.0 4 | 5 | Hyperledger Fabric Sample Query Program for tuna-app: Chaincode Invoke 6 | 7 | This code is based on code written by the Hyperledger Fabric community. 8 | Original code can be found here: https://github.com/hyperledger/fabric-samples/blob/release/fabcar/query.js 9 | */ 10 | 11 | var Fabric_Client = require('fabric-client'); 12 | var path = require('path'); 13 | var util = require('util'); 14 | var os = require('os'); 15 | 16 | var fabric_client = new Fabric_Client(); 17 | 18 | var key = req.params.id 19 | 20 | // setup the fabric network 21 | var channel = fabric_client.newChannel('mychannel'); 22 | var peer = fabric_client.newPeer('grpc://localhost:7051'); 23 | channel.addPeer(peer); 24 | 25 | // 26 | var member_user = null; 27 | var store_path = path.join(os.homedir(), '.hfc-key-store'); 28 | console.log('Store path:'+store_path); 29 | var tx_id = null; 30 | 31 | // create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting 32 | Fabric_Client.newDefaultKeyValueStore({ path: store_path 33 | }).then((state_store) => { 34 | // assign the store to the fabric client 35 | fabric_client.setStateStore(state_store); 36 | var crypto_suite = Fabric_Client.newCryptoSuite(); 37 | // use the same location for the state store (where the users' certificate are kept) 38 | // and the crypto store (where the users' keys are kept) 39 | var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path}); 40 | crypto_suite.setCryptoKeyStore(crypto_store); 41 | fabric_client.setCryptoSuite(crypto_suite); 42 | 43 | // get the enrolled user from persistence, this user will sign all requests 44 | return fabric_client.getUserContext('user1', true); 45 | }).then((user_from_store) => { 46 | if (user_from_store && user_from_store.isEnrolled()) { 47 | console.log('Successfully loaded user1 from persistence'); 48 | member_user = user_from_store; 49 | } else { 50 | throw new Error('Failed to get user1.... run registerUser.js'); 51 | } 52 | 53 | // queryTuna - requires 1 argument, ex: args: ['4'], 54 | const request = { 55 | chaincodeId: 'tuna-app', 56 | txId: tx_id, 57 | fcn: 'queryTuna', 58 | args: [key] 59 | }; 60 | 61 | // send the query proposal to the peer 62 | return channel.queryByChaincode(request); 63 | }).then((query_responses) => { 64 | console.log("Query has completed, checking results"); 65 | // query_responses could have more than one results if there multiple peers were used as targets 66 | if (query_responses && query_responses.length == 1) { 67 | if (query_responses[0] instanceof Error) { 68 | console.error("error from query = ", query_responses[0]); 69 | } else { 70 | console.log("Response is ", query_responses[0].toString()); 71 | res.send(query_responses[0].toString()) 72 | } 73 | } else { 74 | console.log("No payloads were returned from query"); 75 | } 76 | }).catch((err) => { 77 | console.error('Failed to query successfully :: ' + err); 78 | }); -------------------------------------------------------------------------------- /src/fabric-material/tuna-app/startFabric.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # SPDX-License-Identifier: Apache-2.0 4 | # This code is based on code written by the Hyperledger Fabric community. 5 | # Original code can be found here: https://github.com/hyperledger/fabric-samples/blob/release/fabcar/startFabric.sh 6 | # 7 | # Exit on first error 8 | 9 | set -e 10 | 11 | # don't rewrite paths for Windows Git Bash users 12 | export MSYS_NO_PATHCONV=1 13 | 14 | starttime=$(date +%s) 15 | 16 | if [ ! -d ~/.hfc-key-store/ ]; then 17 | mkdir ~/.hfc-key-store/ 18 | fi 19 | 20 | # launch network; create channel and join peer to channel 21 | cd ../basic-network 22 | ./start.sh 23 | 24 | # Now launch the CLI container in order to install, instantiate chaincode 25 | # and prime the ledger with our 10 tuna catches 26 | docker-compose -f ./docker-compose.yml up -d cli 27 | 28 | docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode install -n tuna-app -v 1.0 -p github.com/tuna-app 29 | docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n tuna-app -v 1.0 -c '{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')" 30 | sleep 10 31 | docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n tuna-app -c '{"function":"initLedger","Args":[""]}' 32 | 33 | printf "\nTotal execution time : $(($(date +%s) - starttime)) secs ...\n\n" 34 | printf "\nStart with the registerAdmin.js, then registerUser.js, then server.js\n\n" --------------------------------------------------------------------------------