以太坊与比特币账户的区别

以太坊与比特币的账户模型,从根本设计出发点来讲是不同的。 根据以太坊黄皮书的描述,以太坊账户的概念与“银行储蓄账户”的概念相似。 每个人都能开设账户,且账户初始余额为0。 当以太坊区块链运行时,不断产生的交易会往账户中增加或者减少相应的款项,账户余额随着交易的执行而变更。 这个账户的状态是日积月累地随着时间和交易而变化的。 任意确定的时刻的任意账户的余额是可以唯一确定的。 检索和查询账户余额的操作是便利的,仅需要找到该账户,并读取最后的账户状态即可知晓。 比特币的”Unspent Transaction Output”未花费结余模型(以下简称 UTXO)则刚好相反。 比特币的概念与纸币的概念相似。 例如一个用户收到100元、20元、10元的纸币,比特币没有真正的“账户”的概念。 该用户持有的余额并不是一个单纯的总和数字,而是在此钱包中所有未花费的纸币(输出)的总和。 这就是”Unspent Transaction Output”名称的由来。 而任何支付行为也不是简单的对账户余额的加减。 支付行为是两个顺序操作的过程: 这个操作胜在不需要时刻保持追踪每个用户的余额,减轻了系统负担。 但是,当想查询一个用户究竟有多少余额的时候,需要遍历区块链交易历史,并集齐该用户所有未花费的输出,才能计算出余额。 所幸比特币钱包软件帮助我们自动收集数据,代劳了这个枯燥的过程。 隐私与安全性的比较 以太坊和比特币都是公链,所有的交易的地址在都是在网络中公开并永久记录。 用户在每次收入、消费时,都不可避免地会和现实世界的人打交道。比特币用户和钱包采用如下的两条准则保护用户的隐私: 这三条指导思想在比特币桌面客户端,以及轻量级手机比特币钱包中都得到了贯彻。最大程度保障了用户的隐匿性。而以太坊则恰恰相反,它鼓励的是: 那么,孰优孰劣呢?请思考如下的生活场景。 张三日常使用虚拟货币作为工资结算的方式。 若张三使用 以太坊 ,张三的公开地址是唯一的,他的日常交易行为如下图所示。 张三使用单一账户收工资、支付生活花费的示意图在这种情形下, 使用以太坊账户比使用日常银行账户的隐私性还要低。 若张三使用 比特币 ,张三的钱包 App将替他为每次接收比特币而自动产生新地址,如下图所示。 比特币收款形式:多地址收款。灰色为张三控制的地址集合这种情形下,隐私性得到了一定提升: 数据体积与并发能力 单一以太坊的账户状态其实是世界状态的一个子状态,在全网络的节点中都会留下一份相同的状态拷贝。 每次相关的交易将变更这个账户的状态。 而在对比之下,比特币仅有地址与交易两种数据记录在区块链上,它与持有人不挂钩,并没有保留一份与持有人相关的总和状态。 在系统设计中,以太坊与比特币选择了“空间换时间”和“时间换空间”的不同道路。这在编程领域中是非常经典的做法。 以太坊的账户仅维持一个账户的单一状态,任何状态的改写都是通过交易完成的,对于某账户的结算行为是串行执行的。 账户状态修改后同步到每个网络节点中备份。账户的状态占用硬盘空间体积小,易于查询。 但同时交易过程是不可并发的,只能一笔交易对状态修改完后,再进行下一笔交易。以太坊的交易输入也较为简单,为单一输入。 比特币的 UTXO 则不然。持有人拥有数个,甚至大量的未消费输出UTXO(类比持有多张纸币)。 查询到该持有人的总未消费余额需要花费时间在区块链上进行搜索。 当持有人想同时购买两样不同的东西,并分别为其支付的时候,他可以用不同的未消费输出UTXO来分开支付,发送交易请求到网络上。 交易的确认结算将有很大概率是并行的。这将大大提高对于单一持有人结算的速度。 发送交易时对双花的处理 在数字货币交易中,将一笔交易发送两次,企图让两次转账都获得网络确认的行为,称为双花(double spend)。在数字货币的世界中,经常会发生因为程序错误或者黑客故意反复发送交易请求的行为。这些情况在现实世界中的现金付款场景里是不存在的,纸币在购买前存在于买家手中,在购买后存在于卖家手中。一张纸币不可能同时出现在两处,也不可能被买家支付两次给不同的人。 比特币针对双花问题的处理较为简单直接。它通过共识机制的一部分:仅承认积累难度最高的链为公认链以及用对UTXO Read more…

数字币中的UTXO概念

UTXO是Unspent Transaction Outputs的缩写,中文硬核翻译是没有花掉的交易输出,实际可以理解为在一次转账时剩余没有转出的资金。那比特币为啥要使用这么一个概念呢?这就要从记账方法的账户交易模型和账户余额模型说起了。 因为我们在中心化的体系待的太久,已经非常习惯账户余额模型的记账方式。当用户A给用户B转100块钱时,银行会先检查A的银行账户上是否有100元,如果有就从A的账户里扣除100元再在B的账户上加上100元,这样一笔转账就完成了。 然而,比特币的记账算法里没有余额这个概念。在区块链的分布式账本上记录的只有一笔笔的交易,并不会直接记录一个账户当前余额是多少。假设当前用户A余额是1000元,如果用户A给用户B转100元,这笔转账会被记录成: 交易1 用户A给用户B转账100元 交易2 用户A给用户A自己转账900元 (UTXO) 这里的交易2虽然是一笔交易,但从功能上来说他担当了账户余额的作用,表示在完成这笔100元转账后A的账户上还剩余900元。 那么问题来了,为啥非要造一个这样的UTXO呢?因为在区块链上只能记录交易,没法记录账户余额。如果没有这个UTXO的话,要计算余额需要把一个账户的所有交易的入账和出账全部累加一遍,这是个非常消耗时间和计算资源的事情。而UTXO的出现巧妙的避免了在计算余额时要回溯所有交易的痛点问题。我们来举例解释: 我们假设在没有任何转账的情况下因为挖矿奖励,用户ABC分别有100元在自己的账户上。 用户A 100元 用户B 100元 用户C 100元 之后他们之间发生了几笔交易: 交易ID 发送方 接收方 金额 交易1 A B 10 交易2 B A 20 交易3 B C 10 交易4 A C 30 交易5 A B 40 我们要计算在完成交易5后,A的当前余额的话,我们需要从最开始A账户上的100元开始,把交易1到交易5涉及A的交易(交易1,2,4,5)都计算出来: A的余额 = 100 – 10 Read more…

HD钱包原理

随着去中心化交易所的崛起,以及各类Dapp的涌现,钱包在未来很可能取代交易所,成为数字资产保存、使用的最大入口。因此,理解钱包的使用原理是相当重要的,这直接关系到持币者的切身利益。 目前市场上的手机钱包app按私钥保存的不同表现形式,大致可以分为两种:一种是纯私钥保存,另一种则是种子保存(助记词保存)。 纯私钥保存很好理解,我们都知道公钥和私钥是由非对称加密技术形成的一对钥匙,私钥可以对公钥上的交易进行签名,继而证明自己拥有这个公钥的控制权。因此,早期的钱包以及目前大部分的公链钱包都是支持私钥导入的。 那么种子保存(助记词保存)又是什么呢?在说明这个问题之前要先澄清一个很大部分人对助记词的误区。很多人曾经认为(包括年轻的情报员),助记词是钱包公司创建的一种保存私钥的方式,比如你在进入一个新安装的钱包app之前,钱包会提示你记录下一串词语,并告诉你记录下这串词语就等于掌握了这个钱包中的比特币私钥和以太坊私钥。 实际上这个说法是有歧义的,这种说法让多数人认为,助记词是由这个钱包中的私钥经过一串加密技术转化而成。但是实际上,助记词并非由私钥推演而来,相反的,私钥是由助记词推演而来,助记词则由种子推演而来。 在介绍种子、助记词、私钥三者关系之前,要先讲述BIP协议。 BIP协议的全称是Bitcoin Improve Protical,意即比特币提升协议,它是一个用来提升比特币使用实用性的一种协议。 在BIP协议中,BIP32、BIP39、BIP44是对比特币私钥管理的使用性提高所做的协议,更确切地说,是HD钱包技术的的底层协议。 比特币社区十分倡导Principle Of Avoiding Reuse,即用过的比特币地址就不要再用了,这样有助于交易隐私的保护和地址的安全性。毕竟,如果一个地址有太多的交易记录,而这个地址又和某个人有大量的联系时,相当于这个人的大量交易记录公之于众。而频繁换地址的另一好处,就是提升安全性,要知道量子技术也难以对一个未知的地址发起计算攻击。由此也可以认识到,UTXO的可变交易输出是对比特币安全性提升的一大保证。 但是如果仅仅使用老旧的私钥管理技术,就意味着使用者必须在钱包中预设非常多的比特币地址,这些地址都是各自随机生成的,使用者在一个地址转账时,为了保证Principle Of Avoiding Reuse,在每一次转账后,都将交易输出指向另一个地址。 这种操作手法有一个最大的麻烦,那就是私钥的管理和保存。要知道,要做到保证的足量的交易的话,地址数量需要达到上百上千个,这对普通交易者明显是非常不友好的。这种用来保存无任何联系的地址的钱包叫做非确定性钱包。 因此,BIP32中提出了提出了一套确定性钱包的解决方案协议,即HD钱包协议。HD钱包的全称是Hierarchical Deterministic Wallet,译为树状确定性钱包。顾名思义,在HD钱包中管理的地址之间是有关系的,地址的生成如同树种-树干-树枝的关系。 怎么理解呢? 在BIP32中,规定了一个种子是如何形成的,以及这个种子如何生成一系列的私钥。只要掌握了这串种子,就等于控制了根据这个种子生成的私钥。 随机生成一个种子做示范:【233232995d0e556517d11125ec3e7d1fff8eeae0c36fd9fd91e05832a71451a502e572aa3b118a21a312f9e8c777e2f66e6d83be002dd9ea5bbc9914d7be1d99】,根据这串种子可以衍生出一系列的私钥,例如【KxV8YyTQ6Agkbtc83kGrEUuH54GxsdqtSKjV8wgP5tBzPPCbbCz7】、【KxSoFoyzY1ZMqZUbg2KeCf2aHPGaSKNS2Zd9f3PPenh65sNEc917】、【L3toyntWFZWqfpuZNr1tMYP8z1v8jGCsAfdikwkoQhsdE3WmFcYc】… 只要掌握了种子,就掌握了这些私钥和这些私钥所控制的比特币。种子和私钥的关系就如同树种-树干-树枝的关系,可见HD钱包的命名是形象生动的。 掌握种子显然比掌握成百上千的私钥要方便的多,但显然128位的字符并不好记。于是比特币开发社区在BIP39提出了助记词方案。BIP39中所提出的解决方案是,随机生成数位的助记词,通过这些单词和单词的顺序就能得到种子。 BIP39具体的解决方案是,定义一个包含2048个单词的单词表(参考链接:https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt),生成一串随机序列后,对这串随机序列做一定的算法演变,得到一个新的序列,将序列分割成好几个部分后,将每个部分与单词表上的一个单词做对应,就得到了助记词。而助记词再通过密钥生成函数PBKDF2就能生成种子。 至此,助记词——种子——私钥的生成过程就完成了。BIP32和BIP39方案使得普通数字货币持有者只要记住一串助记词,就能管理无数个地址。 当然,BIP协议不仅仅适用于比特币,在BIP44中还提出了支持多币种的解决方案,即用一个助记词和种子就能管理包括比特币在内的多种数字货币,例如以太坊也支持BIP44。但需要说明的是,HD钱包的一系列协议还是天然最适合比特币,而不太适用于别的数字货币。原因就在于比特币的UTXO特性,而包括以太坊、EOS在内的其他公链都是账户体系。账户体系意味着,余额会存留在旧的账户,倘若转移到新账户,就需要额外一笔手续费。 文末,再补充个脑钱包的知识。脑钱包虽然感觉上去和助记词差不多,都是通过一串单词短语来记住一个一串字符,但脑钱包生成的是一串私钥,不是种子,并且脑钱包的的短语生成不是随机性的,而是很大程度上依赖于人类的语言逻辑。 比如你将一句“今天晚上7点钟,又能看币圈邦德的文章了也。”输入脑钱包生成器,就能得到一串私钥【12ZRkBHjfubmotwyfkzff78AScEkXnhDhb】,但是如前面所说,“今天晚上7点钟,又能看币圈邦德的文章了也。”这句话的逻辑性太强,逻辑与随机是冲突的事情,只有随机才能保证安全性。

Bitcoin Address Formats

A Bitcoin address can be used to send and receive Bitcoin. Each address is long and typically composed of 34-62 alphanumeric characters. How Long Is a Bitcoin Address? A Bitcoin wallet address is between 34-62 alphanumeric characters.  Most resources claim that there are up to about 35 characters, which is Read more…