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