重要概念
-
电子签名(Digital signatures) Signature为256bit,意味着有\(2^256\)种可能,如果没有sk,很难伪造正确的Signature。
Signature = Sign(Message, sk) Verify(Message, Signature, pk) = True/False
-
密码哈希函数(Cryptographic hash functions) 密码哈希函数对不同的信息生成不同的哈希值,而且已知哈希值无法进行逆向计算,只能进行试错(暴力穷举)计算。
sha256(Message/file) = Digest
-
工作量证明(Proof of work) 以计算成本衡量可信度,让人们信任计算工作量最大的账本,使得欺诈在计算上不可行。 找到一个数字,将其加到账单之后,然后对其应用
sha256
哈希函数,使得生成的值的前n位都为0。而且因为哈希函数的性质,使得必须通过穷举的方法找这个数。换言之,如果有人找到了这个数字,那么就可以相信他做了海量的计算。反之,这个数字很容易验证,只需应用一次sha256
即可。 如果修改了账单,就意味着必须重新开始找这个数字。
协议
- 公共账本就是货币
- 将交易信息广播出去
- 只认可有签名(Signature)的交易
- 将账本收集成区块(Block)进行组织
- 每个人都保留完整的区块链(去中心化)
区块链(Block Chain)
将账本(Ledger)的交易信息分割,以区块(Block)的形式组织。
区块:
// 哈希结果的零前缀数目
const difficulty = 1
type Block struct {
// 数据记录在区块链中的位置
Index int
// 自动确定写入数据的时间
Timestamp string
// 数据
Data int
// 此数据记录的SHA256标识符
Hash string
// 链中上一条记录的SHA256标识符
PrevHash string
// 哈希结果的零前缀数目
Difficulty int
// 为了是哈希结果符合要求拼接到区块的值
Nonce string
}
区块链:
+--------------+ +--------------+ +--------------+
| Prev hash | ----> | Prev hash | ----> | Prev hash |
|--------------| / |--------------| / |--------------|
|交易信息(签名)| / |交易信息(签名)| / |交易信息(签名)|
|交易信息(签名)| / |交易信息(签名)| / |交易信息(签名)|
|交易信息(签名)| ------/ |交易信息(签名)| ------/ |交易信息(签名)|
|交易信息(签名)| |交易信息(签名)| |交易信息(签名)|
|交易信息(签名)| |交易信息(签名)| |交易信息(签名)|
|--------------| |--------------| |--------------|
| Prof of work | | Prof of work | | Prof of work |
+--------------+ +--------------+ +--------------+
允许所有人都参与到建设区块链的行动中,意味着每个人都可以监听交易信息,把他们收集成区块,然后做工作量证明(找那个特殊的数字)。
一旦找到这个数,就可以广播出新发现的区块,每个人将其加到自己的区块链中。
为了奖励区块发现者的工作,当他整理出新的区块时,会为他在这个区块上加一个特殊的交易,让他得到相应的奖励。因为这以工作需要很大的计算量,而且产出了新的货币,所以这一工作被称为挖矿(mine)。
对于普通的用户,他们不需要监听所有的交易信息,而只需监听矿工广播出来的区块,然后更新到自己保存的区块链中就可以了。
当收到多条不同的区块链更新时,只保留最长的,也就是工作量做大的那一条。例如:如果A尝试欺骗B,只向B发送假的区块(即区块中的交易信息有A修改的假信息),那么A必须比其他矿工更快的进行工作量证明,因为其他矿工也在进行区块的整理。即使A足够幸运,比其他矿工更快的完成了区块的整理,那么A之后也要不断的做大量的工作来维持这条假的区块链,而另一半是其他矿工维持的正确的区块链,如果A没有全网50%以上的计算力,那么正确的区块链一定会长于A维护的假的区块。这也意味着不能立即相信刚更新的区块。
中本村共识:为了找到工作量最大的链,不能由长度来确定,因为每个区块可以通过修改工作难度(即Difficulty)来伪造较长的链,所以工作量应由难度(2^d+2^d….)确定。
如何交易
- 所有权:一个人能够安全的拥有token
- 交易权:一个人能够把自己的token和他人交易
公钥、私钥系统
私钥对消息进行签名,公钥可以验证签名:
signature = sign(message, privateKey)
isValid = verify(signature, publicKey)
一个有效的私钥是一个32字节的字符串,一个有效的公钥是由’04’开头,紧跟着64个字节的字符串。
公钥是由私钥演绎得到的,我们可以直接把公钥作为区块链中的一个用户的账号地址。当前数字货币(比特币、以太币等)采用的是「椭圆曲线算法」, 每一个钱包账户包含一份密钥对,即私钥与公钥。私钥通常是随机选出的,之后我们就可以使用椭圆曲线乘法这个单向加密函数生成一个公钥,在之后我们就可以使用一个单向加密哈希函数生成该账户地址(A)。
当你发生交易时,每笔交易都需要一个有效的签名才会被存储在区块链。只有有效的私钥才能产生有效的数字签名,因此拥有钱包账户的私钥就拥有了该账户的支配权。
记录交易:
hlo
- older
- Newer