再見二丁目 | yitimo的个人博客

再见二丁目

个人理解区块链及其产品

发布于: 2018-01-23 09:02

此文章久未修订,请自行甄别内容准确性。

本文将从开发者视角谈谈个人近段时间研究区块链技术得到的收获与困惑。

字面理解区块链

从字面理解BlockChain一词,即是多个区块串成的链。其中链的存在需要用心去感受,类比数据接口中链表结构的next指针,这里则是替换称为上一个区块得到的hash,而比特币中矿工的所有工作都是为了得到这一hash以创建一个新区块连接到主链上。其中区块的存在用于存放去中心化的数据,比特币中就是传说中的UTXO,即包含输入(扣钱地址)、输出(加钱地址)的交易记录。

以上所有的数据都没有一个中心化的服务器支撑,而是保存在各个节点,理想状态下每个节点都存有完整的区块链数据,当有新数据产生时,所有节点就都加上包含了新数据的新区快。剩下的问题就是如何保证所有节点的数据都是统一的(重点在于统一,至于正确与否,如果所有节点都认为这没问题,那就是正确的)。

至此区块链目前的一切都讲完了,个人的第一个困惑就是,核心如此简明(且强大)的技术,目前除了二指可数的产品外的其他产品却一直给我一种感觉就是——这跟本没必要使用区块链实现。

简单概括比特币

强烈推荐《精通比特币》一书。

上面提到的这本书的书名很合我意,合意在精通一词,聪明人从不敢轻易说自己精通了什么,但精通比特币却是可能的,因为它足够简单,虽然简单却足够强大。

简单概括比特币做的事情:

  1. 记录交易生成UTXO
  2. 收集UTXO生成区块
  3. 拼接区块到主链

简单补充比特币为了正确完成以上三件事解决问题的方法:

  1. UTXO永久记录且主链统一,余额由所有UTXO计算得到,理论上绝对正确,只存在双重支付可能
  2. 主链侧链机制,双重支付时会产生侧链,但最终只会有一条主链,侧链中的重复支付无效
  3. 挖矿机制,全网竞争记账,成功有奖,但成功记假/错账会直接被推翻

至于多数人盲目放大的密码学技术,只能说是比特币站在了巨人肩膀上,hash啊地址啊公钥私钥什么的,即使是开发者都只需要拿过来用,不应该归为区块链技术,所以上文完全不提钱包地址以及UTXO归属问题,非要提一句的话,保管好自己的私钥,只有自己的私钥能解密属于自己的UTXO,进一步说就是余额。

简单概括以太坊

这里只讲以太坊区别于比特币最诱人的一点,就是智能合约。无耐全网(或者说除了这俩的其他区块链产品)都在有意无意神化智能合约,给人一种这合约好像还真的挺智能的的感觉。

简单忽略以太坊除了智能合约外的比特币传承。

个人理解到的智能合约,不还是个地址而已,只不过这个地址的拥有者是个机器人,蠢到只会机械地做少量事情但又聪明到从不失误的机器人。

从这个智能合约出发,能做的事就多了:

  1. 让机器人先向一亿个地址各收取1个以太币,过一周后随机发五千万给一个地址、一千万给四个地址、一百万给十个地址。
  2. 想想拿了五千万ETH怎么花。
  3. ……

上面这就是传说中的去中心化应用(DAPP),字面理解就是去除中心化(以规则公开的机器人为中心)的应用。

从源码看以太坊中一个交易(类比UTXO)是这样的:

// 以太坊区块中的交易
type Transaction struct {
	// 交易数据
	data txdata
	// 缓存 不关心
	hash atomic.Value
	size atomic.Value
	from atomic.Value
}
// 以太坊交易的数据
type txdata struct {
	// 账户签名,估计代表了谁发起的交易
	AccountNonce uint64          `json:"nonce"    gencodec:"required"`
	// Gas 价格
	Price        *big.Int        `json:"gasPrice" gencodec:"required"`
	// Gas 上限
	GasLimit     *big.Int        `json:"gas"      gencodec:"required"`
	// 交易给谁, 为空则为合约创建,也就是说这个交易把钱给了合约账户
	Recipient    *common.Address `json:"to"       rlp:"nil"` // nil means contract creation
	// 交易数量
	Amount       *big.Int        `json:"value"    gencodec:"required"`
	// 估计就是合约代码啊之类的
	Payload      []byte          `json:"input"    gencodec:"required"`

	// 以下不关心
	V *big.Int `json:"v" gencodec:"required"`
	R *big.Int `json:"r" gencodec:"required"`
	S *big.Int `json:"s" gencodec:"required"`
	Hash *common.Hash `json:"hash" rlp:"-"`
}

可见以太坊相比比特币确实至少在交易上就多了些东西,不过一切都还是明朗清晰的,仍然能厚脸皮说一句以太坊也很简单。当然其在区块和链本身的逻辑上相比比特币也复杂化了一些。

但是,从万恶之源ERC20标准开始,区块链这个技术就让我十分困惑了。

链、币、token、应用

比特币以至以太坊中的链,都足够让我佩服的,保证了各个区块不会过大,并保证区块之间都有关联,任何一个账户的余额,从创世区块算起,都是完全正确的,并且也只能这样计算得到。 但目前除此之外的一些链,都让我觉得,这个链断了也没关系,其所谓区块都是强行构造出来,主要原因是其底层不过也是以太坊中的交易,而其宣称的链根本不存在,只是个合约罢了。 至于币,分两种,一种是比特币、以太币这样由一条条交易计算得到的余额,一种则是以太坊搞出来的ERC20 token,完全抛开网络上的各种白皮书、交易所,其余的币都是由某个智能合约来维护。个人理解的token发布流程概括是这样:

  1. 准备一个智能合约(甚至官方自带)
  2. 发布这个智能合约
  3. 由智能合约来收集大家的以太币,并承诺每个人的地址的新币余额为多少多少
  4. 包装,再包装

由此看来,这些链、币、token、应用其实都是同一样东西——智能合约,岂不是天下大同 : )