前言

undefined0.前言

undefined0.1 内容来源

区块链技术开发公开课:

授课老师: 辕询, 李涛涛

直播地址: http://itgege.gensee.com/webcast/site/entry/join-b0836bdd98c24eb78c67d3a0993b1589

google image

以及其他互联网上的公开内容.

undefined0.2 笔记v1缘起

根据老师公开课上讲的内容, 构造一个完整笔记,便于学习和掌握. 随着课程的进展, 不断添加和整理.

此文档的完整内容来自:公开的课程内容、源代码,资料、搜索引擎搜到的资料、相关技术书籍上的资料等, 我对内容做了整理,使得易于阅读和条理化,对于部分代码添加了注释和自己的理解, 若有错误请沟通纠正。

其中引用到一些同学的笔记内容或者截图,其他笔记内容来源者包括: 程书芝, 袁丁逸涵, 郜晶, liuhongshuo, 谭东雷, 潘杰 …

笔记编写过程中有张博成,pz100等对错误之处给出了的修订建议.

要特别感谢老师依据开源传统所教授的内容.

undefined0.3 笔记v2缘起

区块链技术开发公开课开始了第四期,然而三期因为时间精力等因素记得不全,再加上因为编辑内容太多,需要分开成几部分,重新进行规划。

Part1 收集整理比特币的相关技术与知识,入门,背景

Part2 以课程老师的讲解和实现为主记录的笔记。

Part3 以及区块链更深入的技术介绍。以侧链,智能合约为主.

Part4 密码学的应用机制理解

Part5 以区块链实现过程当中所需的基础知识为主,涵盖老师所讲的语言,系统,编译原理,也包括从互联网,书本上的相关知识分类整理。

undefined0.4 内容编写原则与目的

从原理到程序实现,清晰明了,易于理解,从比特币,区块链的基础知识介绍到依循老师所讲的内容自己创建一个区块链,同时补充所需的计算机基础知识,从密码学,算法,Linux系统操作, 程序开发语言到虚拟机语言等。

undefined0.5 第三期每次课程摘要

  • 第1节:
  1. 主要内容:
  2. 1. 区块链的基本结构;
  3. 2. 为什么私钥最重要,以及随机数 –> 私钥 -> 公钥 -> 地址的生成过程;
  4. 3. 文件系统的结构;
  5. 4. 每个区块链程序都由三种基本协议组成
  6. a) A协议:节点内部的规则,数据格式、交易规则、加密/解密算法等;
  7. b) B协议:应用程序与节点沟通的协议;
  8. c) C协议:节点之间沟通的协议;
  9. 5. 区块间隔和冲突处理机制;
  10. 6. 计算机的数据存储及区块链数据结构。
  • 第2,3节:

    本周的两次课程当中,辕询老师深入拆解比特币的结构,从代码层面向同学们展示了比特币的设计。并通过代码演示,详细的展示了私钥、公钥、地址和区块的生成过程。通过课后的作业练习,让同学们动手生产私钥、公钥和区块,从代码层面理解比特币的原理。

  • 第4节

    周三第4次课,网络编程。辕询老师讲解C语言中套接字函数的用法,并在稍后带同学们使用C语言套接字实现了客户端之间的简单通讯程序。

  • 第5节

    周六第5次课,使用C语言重构代码。辕询老师带同学们回顾区块结构,说明PHP加密函数的兼容性问题,并带领大家使用C语言重新实现区块结构的生产过程。

  • 第6节

    周日第6次课,由密码学主讲李涛涛老师,为同学们讲解区块链中使用的加密算法,并带领同学们深入探讨什么是HASH,为什么要使用HASH等问题。

  • 第7课

    使用C语言重写区块链生成过程。复习区块结构,Transaction的数据结构,Head的数据结构,使用C语言实现Transaction、Head的生成过程。

  • 第8课

    密码学第2次课,讲解了ECDSA(elliptical curve digital signaturealgorithm)椭圆曲线数字签名算法。

    一. 什么是椭圆曲线数字签名算法ECDSA(EllipticalCurve digital Signature Algorithm)

    二. ECC (elliptical curve cryptography)和ECDSA的关系

    三. 为什么使用ECDSA

    四. ECDSA在区块链中的应用

    五. ECDSA的编程实现

  • 第9课,区块数据解析,如何将一个区块的数据读取出来。

    一. 使用scan方法读取transaction的片段长度

    二. 使用build方法构造一个length + data的数据结构

    三. 将build方法生成的指针存储到无类型(void)链表

    四. 使用循环读取链表内容

    课程调整

    本周确定了新增8次课时的上课时间,每周五、周日增加一次授课。调整后每周授课4次,分别为周三、周五、周六及周日。

  • 第10课 -第13课 验证及通过有限状态机和Sockets来接收区块数据.

    区块的接收及验证过程

    通过TCP接收区块数据

    验证格式

    记录valence(区块交易数量)

    验证内容

    验证input,transaction, index参数格式

    验证output格式

    验证签名,使用publc,signature,address进行ECC验证

    验证总输入 大于等于 总输出

    验证剩余输入 大于等于 矿工费

    验证头部

    检查时间:大于上7个区块的平均时间, 保持区块链的时间是不断增加的

    检查工作量证明:TARGET是否少于或者等于协议规定的TARGET。

    检查交易的merkle tree

通过有限状态机(Finite State Machine)对接收的区块数据进行验证。

  • 第14课

    更换了助教. ? 讲解了挖矿难度, One Chain 观点.

  • 第15课

    如何用指针链表来存储区块便于遍历, 同时演示挖矿的概念和代码实现过程

  • 第16课

    通过网络监听并存到storage结构里. 也讲述了节点网络构造和收发钱原理.

    代码实现: cnn.c

以后的规划:

  • 测试验证函数
  • 每一个C协议的操作落实
  • 支持超过一个私钥
  • 生成一个文件来保存别的节点的IP和端口为下次连接做准备
  • 扔掉我们造的storage,改用SQL

    最大的2个目标:

  • 智能合约 smart contracts
  • 侧链 sidechains.
  • 第17课

    我们创造的链与BTC的对比, BTC的最全文档在 https://en.bitcoin.it/wiki/Main_Page

    根据文档讲解协议.讲解了BTC的智能合约script, 介绍了各种钱包.

    讲解了实现虚拟机的php代码.

  • 第18课

    阅读了以太坊的技术规范的黄皮书, 修改了php设计的虚拟机.

  • 第19课

    讲解了区块链的安全性问题. 几种安全方面的攻击原理与特点. 讲解了php的语言实现., 对比我们实现的virtual machine 同 php7的虚拟机实现. 如果区块链的存储要更改,可以改为类似实现, 用hashtable.

    (组成: 256个bucket, 指针列表, 元数据.)

  • 第20课

    基于php开发的wiki, 目前的操作系统界面,浏览器等背景.

    侧链的原理, blockstream公司的开源侧链模板项目element.

  • 第21课

    讲解了基于php的wiki如何嵌入插件, 例如从 https://developers.coinbase.com/docs/wallet/guides/price-data 获取json的BTC价格,显示在wiki里. 和区块链结合的原理. 讲解了侧链的原理,钱如何转移.SPV的细节说明.

  • 第22课

  • 第23课

  • 第24课

    讲解了虚拟机中的script representation of integer. C语言实现

    重温了如何编写基于stack machine的script, 简洁的实现fibbonacci 等.