这篇文章会介绍近期以太坊社群对「交易费模型」的讨论,主要参照自Vitalik 的一场演讲影片,和论坛上的文章”First and second-price auctions and improved transaction-fee markets”,探讨区块链交易的外部性,以及目前的手续费竞标模式存在的问题,和可能的改善方案。
背景知识
以太坊使用“gas” 做为计算手续费的单位,使用者在送出交易时,除了从帐户中扣除转帐金额(msg.value),还要支付gasUsed * gasPrice 的使用费。
根据每笔交易内容不同,手续费也会不同,计算主要有两个考量:计算量、存储量。因为区块链上的交易需要由每个节点重新执行过作为验证,并占用每个节点的硬碟空间,所以越复杂,使用越多容量的交易需要付越多钱。
详细的价格可以参考这份表格。
区块链的交易成本和利益
利益:
对于每一笔区块链上被打包(确认)的交易,它提供了发送者私人利益(private benefit),也就是发送者「希望」交易被确认的理由,因为他想转钱给别人、因为他想买东西、因为他要玩区块链养猫⋯ 等等理由。总之,交易被确认对发送者是有好处的。
成本:
交易的成本分成两部分,一个是内部成本(private cost),一个是外部成本(social cost)。内部成本比较直观,就是发送者付出的手续费,目前手续费是由打包交易的矿工赚走,但也有其他模型正在被考虑,下面会提。至于外部成本的部分,是本文主要想探讨的重点:什么是一笔区块链的外部成本?由谁承担?首先想到的是挖矿消耗的电费,但其实那和交易的关系并不大,而是与挖矿收益和矿工间的零和竞争有关。
实际上,一笔交易的外部成本承受者非常多元。对于每个运行全节点的电脑,这笔交易如果需要纪录状态,比方说产生一只新的猫,就会占用一些硬碟空间;对于区块链网路本身,越多的交易代表节点需要更多时间验证,网路广播效率越慢;甚至连区块链服务提供者,比方说区块链浏览器Etherscan,也承受了交易的外部成本。
收税:
基于区块链交易存在外部成本,且我们无法准确的把钱分配给承担者,收税是很顺理成章的作法。庇古税(Pigouvian Tax)就是藉由对污染(外部成本制造)者课税,以改变市场均衡的方法。在区块链的领域,我们没有政府做为收税的执行者,所以藉由限制区块大小以及手续费竞标的方法,达到类似收污染税的效果。
区块大小的意义
除了有形的计算资源,打包交易的另一个成本即是增大的区块。而更大的区块通常代表着更高的频宽需求、单位时间内需要验证更多笔交易,门槛增高,有能力运行节点的设备数量变少,去中心化程度和安全性相对减少。也就是说,允许更多交易的成本会使整个区块链系统更脆弱。然而,我们也不会为了提高安全性而把区块限制在非常小,因为那会使得手续费竞标变得太过激烈,让整个系统的实用性降低。
为了决定区块大小,我们考虑每增加一单位(比方说一笔交易)的边际成本,如图。当区块非常小的时候,大部分的设备,包括智慧型手机,都有能力运行一个全节点。此时,增加区块大小所牺牲的边际安全性(或边际去中心化性)很高,但同时提升的边际系统可用性也高。
当区块大小膨涨到一个程度,已经没有手机跑得动节点之后,边际成本变低,因为大部分的个人电脑都可以承担比手机大很多的计算量要求,而边际可用性以中等速度提升。
当区块大小增加到普通电脑(笔电&桌机)无法负荷的时候,边际成本再度变高,因为整个网路的节点数会快速下降,只剩下专业设备能运行节点,中心化程度大增,系统付出的安全成本将大于增加的可用性。
考虑实际的案例,如果比特币的区块大小变成50KB,或以太坊gas limit 变成100000,几乎所有的手机,甚至IoT 设备都能运行全节点,但是手续费会高到吓人,只有巨额交易愿意承受。一般人根本不愿意付钱使用,即使手机能跑节点也没什么意义。
反过来说,区块大小10GB 的比特币,或gas limit 10T 的以太坊,若要维持本来的区块时间,势必会导致严重的中心化,变成类似POA 那种称不上区块链的伪物,或EOS 那种由超级节点构成的容易被垄断操纵的系统。
手续费模型
第一价格拍卖
目前的比特币和以太坊采用第一价格拍卖(first price auction),发送者可以自行决定愿意付的手续费,如果交易成功被打包,手续费将从发送者帐户扣除。由于协议限制矿工只能打包固定量的交易,因此矿工会优先处理手续费高的交易。然而,这样的模型对使用者并不直觉,他们心里或许有一个价格,但是为了降低成本,他们会想要出一个刚好能被打包,但不要太高的手续费,也就造成一种不必要的烦恼:猜测最低手续费。
第二价格拍卖
一种改善的方法是采取第二价格拍卖(second price auction),对于所有被打包的交易,不收取他们最开始出的手续费,而是以被打包的交易中手续费最低者的出价为准,对所有人收一样的钱。这样的好处是使用者可以尽情出价,他只要出一个「手续费比这个价格高我就宁愿不要交易」的价格就好。然而,这样的模型却存在明显的漏洞。如图左所示,矿工的手续费是底下那个灰色长方形的面积,也就是交易笔数×最低成交价的金额。矿工可以透过假造一些高价交易的方式,来提高长方形的面积,使得图右中的面积扣掉深色长方形(手续费会回到矿工身上)之后还比图左的大。矿工可以操纵价格,还会让系统效率降低。
手续费价格自动化
为了解决第二价格拍卖中矿工过大的权利,一个由协议自动决定价格的方式被提出。协议决定价格的概念类似于挖矿难度,是根据先前的状态(previous state)自动决定下一个状态的机制,因为它是写死在系统协议里的,任何人都能检验数值是否合法,矿工不容易操纵,或者应该说,矿工比较没有经济上的理由操纵,因为不合法的高收益会被其他节点否认,刻意制造低收益则对自己不利。
目前提出的公式是,将一个区块的gas 使用量锚定在gas limit 的50%,当前一区块打包的交易高于50% 就涨价,低于50% 就降价。透过以价制量,而不是硬上限的方式,让区块的长期趋势维持在半满的状态。
区块链的储存空间定价
目前,以太坊的储存空间也是透过支付gas 购买的,由于这些购买的空间,在使用者不主动释放的情况下,会永久性地占用节点电脑的硬碟,甚至珍贵的记忆体空间,需要用超级高的价格来避免系统被垃圾资料压垮。现在,做一次加法需要支付2 gas,宣告一个变数却要支付20000 gas,价差高达一万倍!不过,即使已经用超高价避免垃圾攻击,如果考虑到系统的长远发展,似乎再高的收费也无法缓解空间无限膨胀的恐惧。
一个潜在的替代方案是:不再提供永久性的储存空间,改以「租赁」的方式让使用者存放资料,这样,收费想必可以便宜很多。这乍看是个很合理的做法,就像使用任何的云端主机一样,你如果要一直用就要持续付钱,使用者便会自觉清掉用不掉的垃圾档案。但是在以太坊智慧合约的情境,非永久的储存空间会为DApp 开发者带来沉重的负担。
当合约签订后,合作关系进展到一半时,当初记载款项的变数居然被释放了,这么可怕的事情是绝对不允许的,但为了避免这个情况,又需要多更多的工程和条件控制来确保储存空间活到它不再被需要。而如果,你的系统是供不特定人使用,比方说ERC20 Token,还要担心涌入的人潮会自动占用更多空间,加速租金被耗尽。开发DApp 已经不容易,还要规划能一边运作一边维持租金的收费模式,简直是工程师的噩梦。
一个稍微减轻工程师恐惧的方法是:不要在租金耗尽的时候彻底删除资料,而是让它「睡着」。把数值从state trie 中暂时移除,让合约不能直接存取数值,但如果任何使用者想要/愿意,他可以提供钱和该数值过去存在的证明,重新「唤醒」这个变数,让合约继续被使用。
不过,这样的模式仍然比过去买断制的空间使用权来得麻烦不少,在实装前可能还需要很大幅度的调整,或者永远不会有上线的一天。