比特币和区块链技术原理(肖臻公开课)

hash function in crypto-currency

hash函数有一类基于密码学,称为cryptographic hash function.

crypto-hash有两个很重要的性质:

1.collision resistance
x ≠ y , H ( x ) = H ( y ) x\neq y ,H(x)=H(y) x̸=y,H(x)=H(y)
这个性质带来了一个好处。当输入为 m m m时,难以用特定的方法求一个 m ′ m' m,使得 H ( m ) = H ( m ′ ) H(m)=H(m') H(m)=H(m),即可以用来digest.

注意这是一个经验性质,而不是被证明的性质.比如MD5,原来普遍认为它拥有很好的collision resistance的性质,后来有人找到了制造碰撞的方法,所以MD5现在不再拥有collision resistance的性质了.

2.hidding

这个性质告诉我们H是单向而不可逆的.给定一个 H ( m ) H(m) H(m)很难找到原像 m m m.

这两个性质使得这类Hash函数可以被应用于digital commitment或digital equivalent of sealed envelope.

实际的hash方法:
x → H ( x ∥ n o n c e ) x\to H(x\Vert nonce) xH(xnonce)
比特币这类区块链还需要一个性质:

3.puzzle friendly

这个性质给予了Hash函数proof of work(PoW)的性质.

同时Hash函数的性质还使得这些puzzle difficult to solve, but easy to verify.

在比特币中,创建账户的方法是建立一个公私钥对,这种方法来源于非对称加密(asymmetric encryption algorithm).

注意hash函数的这三个性质都是基于定义域足够大,我们在定义域中选取了一个足够随机的值这个前提的.

Data Structure

现在我们可以讲一讲区块链关于在数据结构上的定义了:

Blockchain is a linked list using hash pointer.

所谓hash pointer,就是这个数值既是指向一个区块的地址,又是验证这个区块内容的hash值.

hash函数将上一个区块的内容连同上一个区块的hash pointer一起hash,形成新的hash pointer. 这样的好处是不易修改.相比传统的链表,blockchain形成的链表中,深度越浅(越靠近链表头)的节点越不易修改.从而blockchain数据结构可以作为tamper-evident log.

在这个链表中,我们将blockchain的第一个生成的块称为genesis block,把blockchain最后一个生成的块称为most recent block.

但事实上,区块链不总是链状形式,而更广义地会以Merkle tree的形式存在.

Merkle tree is a binary tree using hash pointer

Merkle tree可以提供Merkle proof.所谓Merkle proof,是一种零知识证明,无需泄露信息便可证明某个物体具有某种性质.这个性质来源于Hash函数hidding的性质.

区块一般由两个部分构成.一个是block header,它负责作为链的一部分对各区块进行连接.

block header:{version,hash of previous block header,Merkle root hash,target,nonce}

class blockheader
{
public:
    _int32 nVersion;
    _int256 hashPrevBlock;
    _int256 hashMerkleRoot;//可修改
    unsigned _int32 nTime; //可略微调整
    unsigned _int32 nBits;
    unsigned _int32 nNonce;//可修改
    //coinbase域也可以改
}

另一个是block body,它负责记录交易的信息.block body不参与到结构的构成中,但因为hash将整个block包括在内,所以block body中的信息可以保证不被篡改(以概率的意义上).

How Bitcoin(Blockchain) works

1.采用非对称加密方式生成账户.

按照比特币的标准,只要按照ECC加密生成公钥和私钥,就相当于生成了一个比特币账户.公钥可以为大家所知,这样任何人都可以转账给这个账户,而私钥一般只属于账户的拥有者.

2.按照区块链方式组织账本.

每一条区块链只会有一个genesis block.每个genesis block都会产生一定量的比特币,所以拿到第一个genesis block的人拥有铸币权.拥有铸币权的人,会在genesis block中附有他账户的公钥,表明这些比特币属于这个公钥代表的账户.

除了genesis block,任何其他交易的货币必须指明来源,并签上自己的私钥(按照hash方法加密过的私钥).我们假设A发起了一个交易,他要向B转x个比特币,所以他发布了一个交易请求:“A(账户的公钥)向B(账户的公钥)转了x个比特币,来源是(区块1,区块2,…),sign:A(账户的私钥)”.来源有两种.一种是genesis block中凭空产生的比特币,这时只需要比对公钥和私钥,就能验证这些比特币确实是属于A的.另一种是非genesis block中经他人转账获得的比特币,这时候只需要利用Merkle tree的性质就能够验证这些比特币是正常交易,并且被掌握在A手中,所以也能验证这些比特币确实是属于A的.

3.采用经济博弈淘汰恶意区块.(可以看一点其他的资料,不是很了解)

membership of votes

longest valid chain

orphan block

block reward

transaction-based ledger

UTXO(unspent Transaction Output)

total inputs=total outputs

transaction fee

Possible attack

1.double spending attack

对于参与到区块链网络中的任意一个节点都能够竞争发布区块的权力.当一个节点同时发布了两个交易,其中包含有相同的比特币来源.

这个攻击可能会造成两个后果:
a.一份比特币被花两次.由于区块链的性质,最终一定会有一个交易无效.

b.被舍弃的那个交易已经为攻击者谋得了利益.这个是区块链无法保证的,所以区块链又提出了稳定性的原则,当交易的区块后面已经缀连了六个区块时,我们认为这个交易已经基本不可篡改.

2.Sybil attack

一个用户同时注册多个账户意图掌握网络控制权.

我们后面会讲到,比特币的PoW机制使得控制区块链的能力和该用户掌握的算力成正比,所以一个用户注册多个账户并不会实际提高该用户控制区块链的能力.

3.forking attack

一个节点在同一个区块后面插入多个区块,意图分散诚实节点的算力.

这种攻击在比特币区块链中的实现的几率比较小,因为比特币区块链刷新的时间是10分钟.

zero confirmation

selfish mining: 回滚交易,

你可能感兴趣的:(区块链,比特币)