判断ICO项目:
免费送币的直接Pass
白皮书用简单易懂的语言表达(模式是否清晰)
解决了什么问题,区块链是必须的吗(看产品)
发型代币有无必要,使用系统是否消耗使用代币(如果没有必要,公司的成败和投资者也许没有太大关系)
能否快速上交易所,有交易所的背书
代码是否开源,Github代码更新频率和数量
创世团队的背景(学历、工作),技术团队是否有区块链开发经验
站台的早期投资人,相关领域专家
区块链主要是数字版权和金融,其他都是伪需求,没有区块链也可以把产品做的很棒
ipfs?
比特币的起源:
中本聪,神一样存在的人物
Bitcoin白皮书:A Peer-to-Peer Electronic Cash System
去中心化,P2P分布式的数字货币系统
共识机制---POW工作量证明
运用非对称密码学
区块链作为账本
比特币特性:
硬通货:跨境交易
易携带:只需一个私钥
隐秘性:只暴露钱包地址;非法用途
无货币超发:通货紧缩
Server-Based中心化服务器:
C/S、B/S架构
客户端完全信任服务器
DDOS攻击---Distributed Denial of Service分布式拒绝服务攻击
P2P(Peer-to-Peer)网络:
去中心化;
地位对等,无主从之分
用户越多速度越快
抗攻击
拜占庭将军问题(Byzantine Generals Probblem):
Leslie Lamport,一个关于分布式系统容错问题故事
背景:拜占庭帝国派出10支军队,去包围进攻一个强大的敌人;至少6支军队同时进攻才能攻下敌国
难题:一些将军可能是叛徒,会发布假的(相反的)进攻意向
目的:将军们需找到一种共识机制,可以远程协商,赢取战斗
解决方案:每个节点给所有其它节点发送消息;每个节点根据接收到的所有消息来决定最终的策略
缺点:每个节点向全网节点发送大量的消息
比特币共识机制---工作量证明POW
怎么证明我是个好人
POW(Proof of Work):通过付出大量的工作代价来证明自己是非恶意节点;计算出一个难题的随机答案(nonce),如同扔色子;获取记账权利;打包交易并通知其它节点
理性人都是逐利的,POW抑制了节点的恶意动机
比特币-BTC的产生:
比特币由挖矿产生,通过计算出一个随机数字nonce
生成的BTC被记录在矿工的名下
BTC通过矿工的公钥的哈希值锁定
交易的输出被称为“未花费交易”UTXO(Unspent Transaction Output
)
区块链---一套分布式账本系统
共识机制POW(Proof-of-Work):通过挖矿证明我是善意节点,并获得生成区块的和在这歌区块里记账权利
基于P2P网络,每个全节点都存储了一个历史完整的“比特币银行”账本
新区块通过包含前一个区块头部的哈希值(区块的唯一标示符)建立链接关系:区块链像一列火车,每个区块是一节车厢,每节车厢里装满了交易记录
经过6个以上区块确认的交易才是安全确认的,因为篡改的成本巨大
常用术语---挖矿
在全网中和其他节点竞争计算的过程,证明自己是非恶意节点
获得的权利和义务:记账权,把交易计入区块里;广播义务,把区块在全网广播
获得的奖励:挖矿的奖励,12.5BTC;收取交易费用
常用术语---创始区块
比特币区块链的第一个区块,所有当前链上的祖先区块,由中本聪在2009-01-03 18:15:05挖出
常用术语---Coinbase
挖矿产生的比特币,从每次50,25到现在的12.5枚
常用术语---区块高度&区块深度
区块高度就是有多少个块
区块深度就是有几个确认数
常用术语---交易确认
在当一项交易被区块收录后,就是交易确认
在此区块之后每产生一个区块,此项交易的确认数相应加1
比特币钱包对交易确认数有相应设置
进制---一种计数方法
用有限的数字符号来标识无限的数值,例如阿拉伯数字的10进制(0-9)
可使用的计数符号的数目决定了进位制,简称进制
对称加密
用相同密钥对原文件进行加密和解密
加密过程:密钥+原文=>密文
解密过程:密文+密钥=>原文
缺点:无法确保密钥被安全传递
非对称加密---公钥&私钥
公钥用于加密,私钥用于解密
公钥由私钥生成,私钥可以推导出公钥
从公钥无法推导出私钥
优点:解决了密钥传输中的安全性问题
解决了信息传送的问题,如何验证是“确实是发送发发送的,信件没有被篡改”?
哈希---Hash
将一段数据(任意长度)经过一道计算,转换为一段定长的数据,http://www.fileformat.info/tool/hash.html
不可逆性:几乎无法通过Hash结果推导出原文,即无法通过x的Hash值,而推导出x;无法通过人的指纹推导出他是谁
无碰撞性:几乎没有可能找到一个y,使得y的Hash值等于x的哈希值;几乎没有两个人的指纹是一样的
使用场景:发布文件的完整性验证;服务器中保存用户的密码;数字签名
证书授权中心 CA(Certificate Authority)
CA解决了电子商务中公钥的可信度问题
负责证明“我确实是我”
CA是受信任的第三方,公钥的合法性检验
CA证书内容:证书持有人的公钥、证书授权中心名称、证书有效期、证书授权中心的数字签名
未花费交易输出 UTXO(Unspent TransXtion Output)
UTXO,用比特币拥有者的公钥锁定(加密)的一个数字
UTXO==比特币
比特币系统里没有比特币,只有UTXO
比特币系统里没有账户,只有UTXO(公钥锁定)
比特币系统里没有账户月,只有UTXO(账户余额只是比特币钱包的概念)
UTXO存在全节点的数据库里
转账将消耗掉属于你自己的UTXO,同时生成新的UTXO,并用接受者的公钥锁定
交易的结构
https://blockchain.info/
交易的输出(UTXO):锁定的比特币数量;锁定脚本(用接受者的公钥哈希)
交易的输入(UTXO+解锁脚本):解锁脚本(签名,发送者公钥)
百度搜索:中本聪 躲过陷阱
交易验证---基于栈的脚本语言
栈(stack):操作数据的一种结构
只能从一端操作数据,后进先出LIFO(Last In,First Out);如同子弹匣,先压入的子弹最后打出;压栈(PUSH)、出栈(POP)
交易验证:基于栈的脚本语言
对栈的操作:OP_DUP
逻辑运算符:OP_EQUALVERIFY
加解密运算符:OP_HASH160,OP_CHECKSIG
算数运算符:OP_ADD,OP_SUB,OP_MUL,OP_DIV
逆波兰表示法
简易运算规则:
所有操作符号玮淯操作数的后面
遇到操作数(数字),则压栈PUSH
遇到二院运算符(+-*/):先将2个操作数出栈POP,然后对运算数进行计算,最后将计算结果压栈
传统表达式(中缀表示法):(1+2)*3=9
逆波兰表示法(后缀表示法):1 2 + 3 * 9 ==
交易验证
锁定脚本:OP_DUP OP_HASH160<发送者公钥哈希> OP_EQUALVERIFY OP_CHECKSIG
解锁脚本:<发送者签名><发送者公钥>
交易验证:运行解锁脚本+锁定脚本=>True
交易的传播&验证
交易包含两部分,n输入和m输出,n>=0,m>0:
输入==要被花费的UTXO+解锁脚本
输出==UTXO(币值+锁定脚本)
钱包软件生成交易,并向邻近节点传播
节点对收到的交易进行验证,并丢弃不合法交易:
交易的size要小于区块size的上限
交易输入UTXO是存在的
交易输入UTXO没有被其它交易引用-防止双花(Double Spending)
输入总金额>输出的总金额
解锁脚本验证
将合格的交易加入到本地的Transaction数据库中,并将合法交易转给临近节点
区块的生成
矿工在挖矿前要组建区块:
将coinbase交易打包进区块
将交易池中高优先级的交易打包进区块
优先级=交易的额度*UTXO的深度/交易的size
防粉尘共计?
创建区块的头部:版本号、父区块哈希、Merkle树根、时间戳、难度值、Nonce
挖矿成功后,将计算出来的随机数nonce填入区块头部,向临近节点传播
区块的验证链接
相邻节点收到新区块后,立即做以下检查:
验证POW的nonce值是否符合难度值
检查时间戳是否小于当前时间2小时
减产Merkle树根是否正确
检查区块size要小于区块size的上限
第一笔交易必须是coinbase交易
验证每个交易
http://btc.yt/lxr/satoshi/ident?_i=CheckBlock
Merkle Tree结构
树:由多个节点组成的一种数据结构:
每个节点储存数据;根节点Root;父节点、子节点、兄弟节点
构建二叉搜索树
Merkle Tree:防止数据篡改;快速验证某个交易是否存在;节点存储Hash值;从叶子节点构造树
Merkle Path:验证路径
只需log2(N)个已知数,即可验证K是否被包含在区块中
软分叉
有比特币交易的数据结构改变引起,但区块的数据结构未改变
老节点接受新旧格式的区块,新节点只接受新区块
矿工激活软分叉MASF(Miner Activated Soft Fork)
用户激活软分叉UASF(User Activated Soft Fork) BIP148:
Core团队新发明,应对矿工的不合作
隔离见证Segwit(Segregation Witness) BIP141
硬分叉
由于交易结构的变化,或区块的结构的变化引起的
新旧节点互相拒绝对方的区块
产生两个币种,如BCC
临时分叉
仅发生于几乎同时爆块的情况
分叉是暂时的
根据共识机制,矿工最终切换到最长链上挖矿
短链上的交易全部无效,包括矿工费
矿工是否会继续在短链上挖矿以弥补损失?
隔离见证
隔离见证Segwit(Segregation Witness):
安全隐患,黑客通过改变交易签名信息改变交易ID
将签名部分从交易中移除,从而间接扩容
香港共识:2016年2月香港会议,Core团队的代表同意在实施隔离见证后扩容到2M
纽约共识Segwit2x:2017年5月纽约会议,代表全网80%的算力的矿业代表在纽约达成Segwit2x扩容,实现BIP141(SegWit)+BIP91(缓和折中方案)+BIP102(升级到2M)
Core团队VS矿工
Core反对的原因:
不愿意轻易更改系统,如银行仍使用COBOL语言编写的系统
以防个人不能运行全节点,因为每个区块太大了
增加2兆没有什么大的作用,用闪电网络解决
矿工反对的原因:
闪电网络将会导致交易的中心化,违背比特币点对点交易的初衷
闪电网络隶属BlockStream公司,大多数Core团队的成员是BlockStream的雇员
交易费的损失
Core垄断了海外的论坛,利用他们对社区的影响力“封杀”反对Core的开发者和社区成员
结论:Core为闪电网络铺平道路,矿工为了交易费
BCC分叉
BU团队(Bitcoin Unlimited):
BU的大方案曾获得了全网40%的算力支持;方案的Bug太多,未能获得社区广泛支持
BitcoinABC团队(Adjustable Blocksize Cap):
基于BU的代码,打造了BCC,8月1日硬分叉;BCC没有Segwit,区块容量8M;BCC官网:https://www.bitcoincash.org
比特币私钥格式WIF(Wallet Import Format)
WIF私钥格式更短,标准格式私钥256个bit,16进制长度=256/4=64字符
经过Base58编码,是标识长度更短
未压缩格式私钥:5开头,达效是51字节,第一位存放版本信息
压缩格式私钥:K或L开头,大小是52字节,第一位放版本信息,多出的最后一个字节存放是否压缩信息
WIF格式可以自动侦测地址错误:通过私钥的哈希值产生校验码
公钥---压缩格式&非压缩格式
公钥由x和y轴的值组成,未压缩公钥04开头,压缩公钥02/03开头
轻钱包&SPV验证机制
轻钱包是比特币的非全节点,存储空间限制:
只下载block header,size很小只有80字节,区块本身大小1M,1.8M
版本号、父区块哈希、Merkle树根、时间戳、难度值、Nonce
向邻近全节点发送请求得到UTXO信息
简单支付验证SPV(Simplified Payment Verification):
非全节点支付验证,判断交易是否已经在区块链中,多少确认数
向临近全节点发送请求关于特定比特币地址和交易的信息
临近全节点向钱包返回Merkle path验证路径和响应block header
钱包根据Merkle path算出Merkle root,验证是否匹配block header里的Merkle root值
确认响应block header的深度是否大于6
生成自己的私钥
通过某些私钥生成网站,安全性问题
掷骰子,16面的扔64次
用中文、英文或汉语拼音的哈希值:
http://www.fileformat.info/tool/hash.htm
私钥转比特币地址:
https://github.com/grondilu/bitcoin-bash-tools
为什么要挖矿
比特币系统里为什么要设计挖矿:增加恶意行为的成本;争夺记账权利,获取奖励
每开采210000个区块,挖矿奖励减半
挖矿流程图
挖矿前要构造好区块:版本号(4字节)、父区块哈希(32字节)、Merkle树根(32字节)、时间戳(4字节)、难度目标值(4字节)、Nonce(4字节)
难度目标值:256比特
经过不停的改变Nonce尝试使Hash值小于难度值
https://gizmodo.com/mining-bitcoin-with-pencil-and-paper-1640353309
挖矿难度调整
每2016个区块调整难度
新目标值=当前目标值*(过去2016区块用时分钟/20160分钟)
难度目标值:区块头部hash要小于的值
由系数和指数构成
难度:难度为1的难度目标值/当前难度目标值>=1
矿池
矿工无需运行全节点,只需安装挖矿软件
矿池管理员维护全节点,并把任务分段,给矿工不知挖矿任务
矿池分类:
PPLNS:Pay Per Last N Shares(蚁池AntPool):根据过去一段时间所做的贡献,获得了多少“份额”来获得比特币奖励;滞后惯性,挖矿收益会有一定的延迟
PPS:Pay-Per-Share(蚁池AntPool,BTCC):按矿工所占矿池算力的大小按比例获得比特币报酬,每天都分;某矿工当日锁的奖励:=预估矿池当日可挖到比特币数量*某矿工算力所占比例
FPPS:在分coinbase的基础上,也分得交易费(矿池BTC.com)
P2P矿池---P2Pool:防止托管矿池管理者作弊,基于区块链技术,去中心化的矿池管理系统;矿工需要自己运行全节点;根据矿工贡献的算力来确定分红
托管矿池:矿工把自己买的矿机托管到矿场,有矿场帮助维护打理
可塑性共计
可塑性也称可锻性,是指一个物体的外形改变不引起质量和物理化学属性的变化
交易签名具有可塑性,有多种写法
修改交易签名引起交易的哈希值改变,即TXID改变
TXID发生变化会导致原TXID无法找到,造成攻击漏洞
隔离见证:可伪造的签名部分移出交易数据结构,在另外一个地方存放签名;改变签名不影响TXID的变化
构造交易
查看UTXO:listunspent
生成初始交易:createrawtransaction
查看初始交易:decoderawtransaction
UTXO锁定方式:MultiSig-Multi Signature多重签名;P2PK-Pay to Public Key用公钥锁定;P2PKH-Pay to Public Key Hash用公钥的哈希锁定;P2SH-Pay to Script Hash用脚本锁定
对交易进行签名:signrawtransaction
向全网广播交易:sendrawtransaction
“偷币”
1、创建私钥,生成对应的公钥和比特币地址
2、调用相应API接口listunspent 0 9999999999 [生成比特币地址]
3、查看amount字段的值,有没有比特币,如没有返回步骤1
4、调用相应API接口createrawtransaction,创建向自己的比特币地址转钱的初始交易
5、调用相应API接口signrawtransaction,对交易签名(用到生成的公钥)
6、条用相应API接口sendrawtransaction,将交易向全网广播,坐等收钱
7、回步骤1
重放攻击---非人为共计
重放攻击Replay Attach:
攻击者重复发送相同的数据包到目的主机,用以欺骗系统;
用支付宝付款信息重复向商家索取商品
比特币重放攻击:
并非何可的主动共计
从美国寄信到清华大学,大陆清华还是台湾清华
区块链硬分叉后需有防止重放攻击措施,BCC
改变交易或签名的结构和验证规则,例如按位取反1<->0
以太坊ETH ETC被重放攻击
其他攻击
粉尘攻击:大量低额度的交易,目的让网络拥堵
空区块共计:不打包交易,只有coinbase
51攻击:拥有51%以上的算力
双重支付共计,一笔钱支付给两个不同的人(没有等6个交易后就发货的风险)
拒绝服务共计,拒绝对某个特定的比特币地址提供服务
智能合约---Smart Contract
一份电子形式合同或协议
以一种计算机程序的形式展现,例如App
通过计算机自动执行和验证,无需人为干预,例如柜台取款VS ATM机取款
通过淘宝下单付款后商家发货,确认收货后系统自动转钱给商家
法律层面上是否承认有待商榷
小蚁的股权发型,登记和转让交易
二手房过户,能否绕过住建委
需要政府的推动和背书
智能合约的风险案例---The DAO
合约一旦部署成功将河南更改,计算机程序难免出现Bug
The DAO事件:
The mother of all DAOs
一个智能合约形式的VC基金,众筹了1.62亿美元
股东通过众筹获得代币和投资投票权
代码漏洞,被黑客将币盗走大量代币
被迫分叉,分裂为ETH和ETC两种代币
以太坊主要特性
Vitalik于2015年7月创建的区块链
区块链2.0,支持智能合约
支持图灵完备语言,Solidity
Gas:衡量在一个计算中要求的费用单位
总费用=Gas limit*Gas price
gas不够时交易处理就会被终止,回退到之前的状态,不退费
虚拟机(Virtual Machine):通过软件模拟计算机硬件的一套系统,运行在宿主机系统上
以太坊虚拟机EVM:执行智能合约的安全运行环境,通过执行合约的bytecode来执行智能合约
货币发行总量无上限,出块时间平均每12-15秒,每个区块奖励5ETH
叔区块uncle block奖励
Keccak SHA-3哈希算法,反ASIC挖矿,需要大量内存
智能合约的部署运行
https://ethereum.gitbooks.io/frontier-guide/
安装geth客户端-go语言版本
brew tap ethereum/ethereum
brew install ethereum
命令行部署智能合约
geth --datadir"privateChain" init genesis.json//创建私链
geth --datadir "privateChain" console//进入控制台
geth attach ipc:/Users/bingzhou/Libray/Ethereum/testnet/geth.ipc
personal.listAccounts
personal.newAccount('12345678')//create new account
web3.eth.getBalance(addr0)//查询账户余额
amount = web3.toWei(1.5); eth.sendTransaction({from:addr0,to:addr1,value:amount})//转给addr1 1.5个以太币
personal.unlockAccount(addr0)//解锁账户
miner.start();admin.sleepBlocks(1);miner.stop()//挖矿
部署智能源代码
http://ethereum.github.io/brower-solidity //在线编译器
源代码:
pragma solidity ^0.4.0;
contract Rating{
function setRating (bytes32 -key,uint256 _value) public{
ratings[_key]=_value;
}
mapping(bytes32 => uint256) public ratings;
}
eth.sendTransaction({from:addr0,code:"the code here",value:web2.toWei(10,"ether")})
brower_ballot_sol_rating.setRating.sendTransaction(1,3,{from:addr0})