在学习课程的时候,你也可以免费领取BaaS平台为期一个月的试用机会,免费使用高性能区块链服务(点击文末的原文链接即可免费领取)。课程学习结合实践操作,让你迅速成为区块链大牛! *以下为第五课的内容~ 第五课 账户与账本 区块链中的账户和银行账户有什么区别?对于想了解区块链账户的人来说,这可能是第一个想知道的,要一窥究竟,还得先看看银行账户是什么样子。首先,银行账户有一串固定长度的数字,叫账号,账号唯一标识一个账户,账号可以公开;其次,账户所有者通过自己设定的密码控制该账户,密码是私密的;最后,转账时需要转出方的账号和密码,以及转入方的账号。不管是银行卡还是存折,我们看到的银行账户基本就是这样的两串字符(账号和密码)。 区块链账户也具备上面三个特点,即账号、密码和转账需要转出账户密码,另外也有一些不同。之所以不同的主要原因是,银行系统是中心化的,类似账户转账这样的交易只在一个地方校验,而区块链是去中心化的,账户发出的交易在每个地方都需要校验。也就是说区块链中,不仅转出账户A要用密码证明是自己在转账,转入账户或中间任何一个环节都要能证明这笔钱确实是A转出的。要理解区块链账户怎么做到发出的交易在每个地方都可以被校验,就需要了解一些密码学知识,下面先介绍一下加密、解密、密钥、对称加密和非对称加密,然后讲一下区块链账户和非对称加密的关系,最后通过以太坊让大家对区块链账户有个直观的认识。 密码学方案加密就是把多数人能懂的东西变成少数人的秘密。这里面有很多有趣的故事,除了“天王盖地虎,宝塔镇河妖”,还有钱壮飞的“天亮已走,母病危,速转院”。当然,最经典的还属初中生Alice写给Bob那张纸条,帮忙递纸条的韩梅梅和李雷虽然看到内容,但都一脸懵逼,而Bob看完却很开心。Alice显然把信息“加密”了。Bob之所以开心,是因为他“解密”了纸条的内容“zvff lbh gbb”。最后,在班主任的逼问下,大家才知道Bob和Alice早就商量好一套字母替换规则:用26个字母构成一个环,然后对称替换。所以,Alice实际写给Bob的是“miss you too”。信息加密后,即使不相关的人看到纸条,因为不知道替换规则也不明白什么意思。通过这个例子,大家应该明白什么是加密,什么是解密。这里再借用维基百科的定义规范一下。加密是将明文信息改变为难以读取的密文内容,使之不可读的过程。这个过程反过来,就是解密。密钥是指某个用来完成加密、解密、完整性验证等密码学应用的秘密信息。据此,明文是“miss you too”,密文是“zvff lbh gbb”,密钥就是那个字母替换规则。 区块链账户 区块链账户本质就是非对称加密中的公钥和私钥,其中公钥“类似”银行账户中那串数字账号,私钥对应密码,一般使用基于椭圆曲线secp256k1的ECDSA算法生成256比特的公私钥。基于前面讲到的公私钥的特性,账户所有者公开公钥,用私有的私钥加密(签名)转账交易,那么这个交易只能被配对的公钥解密,因为公钥公开,所以交易可以在每个环节被校验。
我们要去银行开户才能有自己的银行账户,那怎么拥有区块链账户,也要拿着身份证去什么地方开户吗?当然不需要!你可以用任何方法随机生成256比特的数作私钥,再借用工具推出对应的公钥,这一对公私钥就是一个账户。区块链账户和区块链系统是分离的,获取账户不需要注册,坐在地上抛256次硬币也能生成账户。甚至可以看看新生成的账户有没有以太币或比特币,因为公私钥就是一对数字,大家都可以用,说不定你和中本聪选用了同样的一对数字,要知道聪哥拥有一百万比特币。如果新生成一个账户已经存在,这叫账户碰撞,如果账户已经有钱,就叫中彩票。既然如此,用程序快速的永不停息的去碰撞有钱的账户,岂不是发财之道?这其实是个概率问题,因为256位的二进制表示的数,没比整个宇宙的原子个数少多少,所以账户碰撞是小概率事件。程序运行几十年碰撞出来的账户,那点钱估计还不够电费,所以想那样发财是不可能的,亏本的概率非常大。
虽说区块链账户本质就是一对很大的数字表示的公私钥,但使用上还是有点不一样。下面用以太坊为例,让我们看看怎么生成一个账户,以及账户表现是什么样子。以太坊账户新建指令是geth account new,具体参数使用可通过geth account new -h查看。下面是我在Centos7以管理密码1234创建账户时的输出: 在图中我们看到,以太坊账户创建成功会在keystore目录下生成一个JSON格式的文件。可以理解为,文件内容是以对称加密的方式隐藏的账户私钥,对称加密的密钥由管理密码和kdfparams参数经过scrypt算法生成。这样因为账户没有明文保存,所以提高了安全性;转账只需要输入管理密码,剩下的校验和签名都交给账户管理程序,所以账户使用也更方便。虽然只需要记住账户管理密码,但账户本质还是那对公私钥。现在将私钥加密存储在文件中,一旦文件丢失,就相当于把绣花针丢进了大海,幸运的话,几百年后某人才会碰撞到这个账户,所以一定要备份好这个文件。 现在我们对区块链账户也有了直观的认识,但是账户里的钱在哪里?答案就是,在“账户地址”里,账户地址相当于银行账号。前面我们讲,区块链账户与区块链系统是分离的。这里,账户地址就是它们的桥梁。账户地址是由字母和数字组成的字符串,由账户公钥经过一定规则计算生成。刚才新建的以太坊账户地址是“c31e97c5fce994ba449b05191bdda25d06fcaf83”,它是由账户公钥通过keccak256哈希取后160位生成(以16进制形式表示为20字节的字符串)。具体区块链系统的账户地址可能有所不同,比如比特币的账户地址包含了校验码,用来防止转账时输错目标账户地址;另外以太坊还有合约账户地址,用来存储和执行智能合约代码。账户地址在不同区块链虽然可能表现为不同形式,但大多是由账户公钥通过单向函数计算生成,一个公钥对应一个地址,从地址无法推算出公钥。因此,账户私钥推出公钥,公钥推出账户地址,是一个单向的推导过程,不能反推。 账户模型 另一种就是比特币采用的UTXO模型(Unspent Transaction Output,未花费交易输出),该模型要求交易包含输入和输出两部分,输入是其它账户转钱给自己的交易,输出是目标账户地址和金额。具体如上图所示,输入包含的是交易哈希和交易在区块中的位置,输入可以包含多笔交易,输出也可以有多个目标账户地址和金额。一笔交易,只有用输出中的账户地址对应的私钥解密,才能使用该地址对应的金额。如果输入引用的交易总金额大于自己想要转账的金额,可以在输出添加自己的账户地址,并且指定该返回多少钱,输入的总金额减去输出的总金额将被系统当手续费收取。所以,账户余额在UTXO模型中表现为一系列交易的集合。要知道账户总余额,需要收集它所有的未花费交易,并将交易对应的输出金额累加起来。 账本 区块链不管选用哪种账户模型,发出的交易只要成功,都会被系统永久记录下来。账本其实就是成功交易的集合,在区块链中表现为一个个可能包含多笔交易的数据块(区块),这 |