据国外媒体报道,Bitcoin是一种开源的、点对点的(Peer-to-Peer)网络电子货币,由Satoshi Nakamoto开发,并由一小组开发人员维护。知名科技博客读写网(ReadWriteWeb)的克林特·芬利(Klint Finley)在制作“分布式网络“专题系列时,就Bitcoin软件的运作方式,采访了该项目的加文·安德烈森(Gavin Andresen)。全文摘要如下:
本文是对Bitcoin的技术性概述。如果你对该软件所涉及的政治经济元素有兴趣,可以参看相关的维基百科条目或尼可拉斯·布兰查德(Niklas Blanchard)的论文。 简述Bitcoin 的运作机制 问(克林特·芬利):你能否向那些不太熟悉Bitcoin的人简短地描述一下它? 答(加文·安德烈森):当然可以。 Bitcoin是一种点对点的货币——它是由人而不是由中央银行或政府创造的货币。 问:它的运作机制是怎样的呢? 答:大家都会试图生产Bitcoin,并且通过一个点对点的网络来交易Bitcoin。大家运行的代码将阻止作弊行为的发生—— 没有人能创造超量的Bitcoin,也没有人能够把已经支出的Bitcoin再次支付出去,而且只有Bitcoin的合法所有者才能使用它。 关于Bitcoin,真正的创新理念在于这样一个机制:无需依赖一个中央权威装置就能防止Bitcoin被重复支出。 另一个的重大新理念则是:无需依赖一个中央权威装置就能限制Bitcoin的供应量。 解决“引导问题”的3种机制 问:你门是如何在没有中央权威装置的情况下做到这些事的呢? Bitcoin客户端和服务器又是如何找到对方的呢? 答:我先从容易的问题谈起 —— Bitcoin客户端如何找到对方: 所有的点对点网络都存在“引导问题(the bootstrapping problem)” ——没有中央服务器,网络上的节点(机器)需要能够找到对方。Bitcoin使用以下3种机制来解决这个问题: 1 在默认情况下,Bitcoin客户端加入了一个IRC聊天通道,并得知加入该通道的其他客户端的IP地址和端口。该通道的名称(和IRC聊天服务器的名称)被写死(Hardcode)在了Bitcoin软件中。 2一些“知名的”Bitcoin节点也被编写在了软件中,以防IRC聊天服务器由于某种原因无法访问。 3你还可以手动添加(通过配置文件或命令行选项)可以运行Bitcoin的其他机器的IP地址。 一旦你连接到了Bitcoin 的点对点网络上,别的机器发送给你的信息中就会包含它们所知道的其他IP地址(及端口),所以那时你将会通过Bitcoin网络自身来找到其他Bitcoin节点。 人们也在积极讨论其他可能的引导机制,所以如果在未来一年左右出现了新的引导机制,我也不会感到惊讶。 和“引导”相关的其他问题 问:我猜你也可以手动改变IRC聊天服务器和通道? 答:实际上不能 。要那样做的话,你必须重新编码。 问:这是为什么? 答:我们对“引导”的想法是定义一个地方,你可以去那里寻找其他的节点,所以建立第二个IRC聊天通道将是毫无意义的。而且现有通道也没有限制可以连接到它的客户端的数量,因此实在没有理由使用多个通道。 问:但是,在IRC聊天服务器关停时怎么办呢? 答:几个月前,Bitcoin确实更换过用于引导的IRC服务器——我们发布了一个新的客户端,它使用不同的IRC网络。所以如果是IRC服务器暂时关停,全新Bitcoin客户端将使用备份的 “知名的”节点名单。旧的Bitcoin客户端将连接到它们之前连接的节点上——在最后一次运行Bitcoin时,相当IP地址被记录在了'addr.dat'数据库文件中。 问:是否有什么机制,要求客户使用软件的最新版本进行连接? 答:可以说有,也可以说没有。 我们不会阻止旧的客户端进行连接。我们支持旧客户端“向上兼容”。但是几个月前出现的一次重大错误,让我们的主要开发人员(Satoshi)决定采用一个机制,通知那些使用不够安全的版本的用户升级。 我们当然不会鼓励人们运行版本很旧的Bitcoin软件。 限制Bitcoin供应量 问:能谈谈较困难的部分吗——在不依靠中央服务器的情况下,如何防止Bitcoin被重复支出,以及如何限制Bitcoin的供应量? 答:我先说说限制供应量的问题。 根据Bitcoin的设计,总共只能有2100万个货币被生产出来。当前货币的生产速率是每10分钟50个左右。 首先,你要生产Bitcoin,你就要争取成为第一个创造出新的“版块”(Block)的人。一个版块,就是上一个版块出现之后的所有交易(“我给予/销售/交易这些Bitcoin给你”)。因此,要生产Bitcoin,我的机器就要等待并获悉新的交易,把这些交易捆绑成一个版块,然后对这些数据反复运行一个散列算法(hashing algorithm)。我运行散列算法(把任意长度的数据转换成256位),试图找到一个足够小的散列值,以便向整个网络宣布“我赢得了找到下一个有效版块的比赛”。如果成功了,我就得到50个Bitcoin货币。 目前来说,每一个新版块价值50个Bitcoin。大约每两个星期,网络上的所有节点就会评估这段时间有多少版块被创建出来,并自动(且独立地)调整“难度”。像这样,平均而言,约每10分钟整个网络中就会出现一个新版块。这就是Bitcoin为什么能在没有中央服务器的情况下限制供应量。 你只有解决“找一个小的散列值”的问题后,才能创建一个版块。据我们所知,解决这样的问题只需要大量的、强大的计算能力(反复运行散列算法)。网络上的每个人都可以进行检查,看你是否确实解决了这个问题(只计算一个散列值真的很容易),也可以确保新版块里只包含有效的交易,而你只能从创建新版块中获得50个Bitcoin货币。 问:需要多少交易来创建一个版块? 答:数量不定——至少是一个交易,直到一个任意制定的、将来可以很容易改变的数量。你可以去Bitcoin Block Explorer网站看看版块里面是什么。 防止同一笔Bitcoin被重复支出 问:那么如何防止同一笔Bitcoin被重复支出呢? 所有交易都会被广播到这个点对点网络上的每个节点.....这是解决方案的第一部分。 如果一笔Bitcoin被支出两次的情况广播出来,那么某些节点将先看到它第一次发生的支付交易,其他节点则看到的是它第二次发生的支付交易。 究竟是哪一个支付交易“赢”了,则是由恰好创建了下一个版块的那个节点来决定 —— 无论是哪个节点找到了“小的散列值”, 它的板块中包含的那个支付交易被判断为有效的,其他的支付交易被视为无效。 偶尔会出现网络中的两个节点几乎同时找到有效版块的情况,这样事情会变得很奇怪。 问:为什么有很多人都会尝试作弊? 答:我也想知道!我希望有人编写一个工具,能发现这个网络上的作弊企图。 问:同一笔Bitcoin被重复支出的情况有没有可能是意外发生的? 答:这真的不太可能是意外。 关于项目管理 问:你们有一些开发人员在参与Bitcoin项目——那么如何进行项目管理呢? 我们正处于一个过渡中,从基本上是一个单人制作的项目(Satoshi编写所有的代码,把关所有的变化)过渡来源更开放、由社区主导的模式。我自告奋勇尝试以一种更加分散的方法来改善Bitcoin软件。我们将采取类似于维护Linux的做法,提交(使用Github)上来的补丁会经过审查,然后决定是接受它还是退回去返工。 问:对于那些对分布式计算感兴趣的开发人员,你可以推荐一些资源吗? 答:这是个好问题!分布式计算中的很多问题现在还处于尖端性的研究过程中,我不太确定应该从哪里开始。我个人的背景不是点对点网络,所以我不是合适回答这个问题的人。 问:你认为分布式计算和强大的密码系统相结合,可以替代“云计算”,为那些交不起服务器租金的人服务吗? 答:是的,虽然把应用程序放在云上非常便宜。就我自己来说,在Bitcoin相关项目的前端,我使用谷歌的App Engine,在后端的Bitcoin网络节点,我则使用VPSes和亚马逊的EC2。 使用App Engine创建应用程序,是一种不错的、免费的学习可扩展的分布式计算的方法。 问:你认为Bitcoin的源代码可能作为建立其他类型的点对点社区的基础吗? 答:不能,它是专门为Bitcoin设计的,而且效果也很好。其他的点对点社区有不同的网络需求。 |