比特币0.17.0版本客户端发布在即,隐私功能成为亮点

201809050303409478.jpg

 
比特币最新版的客户端Bitcoin Core 0.17.0距正式发布已越来越近,这也是10年来比特币的第17代客户端版本。
 
据Bitcoin Core 维护者Wladimir van der Laan预计,这一版本的客户端最早将于9月8日发布。目前其在github上的完成度已经达到了92%。
 
以下为0.17.0版本更新说明:(注意,这只是一个临时版的说明,正式发布时可能会稍作修改)
 
Bitcoin Core 0.17.0 版本可以在这里访问了:
 
https://bitcoincore.org/bin/bitcoin-core-0.17.0/
 
这是比特币的重大更新版本,更新内容包括新功能、各种bug修复,以及性能提升。
 
开发者可以使用GitHub的问题跟踪器上报错误:
 
若要接受安全及更新通知,请订阅:
 
https://bitcoincore.org/en/list/announcements/join/
 
 
如何更新
 
 
如果你运行的是旧版本客户端,请关闭它,直至其完全关闭(旧版本可能需要几分钟的时间),然后再运行安装程序(在Windows上)或拷贝覆盖至/Applications/Bitcoin-Qt(Mac系统)或bitcoind/bitcoin-qt(Linux系统)。
 
如果你的节点具有txindex(维护所有交易的索引),那么在你第一次运行0.17.0(或更新的)客户端时,这个txindex db就会进行迁移,这可能需要几个小时的时间。在迁移完成之前,你的节点将不起作用。
 
当你第一次运行0.15.0或更新版本的客户端时,你的链态数据库将转换成一种新的格式,这取决于你机器的速度,所花费的时间从几分钟到半小时不等。
 
注意,区块数据库格式在0.8.0版本中也发生了变化,并且在0.8版本之前的客户端到 0.15.0版本的客户端并没有自动升级代码。在0.7.x版本或更早版本的客户端,无法实现直接升级(需要重新下载区块链)。不过,和往常一样的是,旧版本的钱包仍然是支持的。
 
 
降级预警
 
 
此版本的链式数据库,与先前的版本并不兼容,因此,如果你运行的是0.15版本的客户端,然后你决定切换回任何旧版的客户端,你就需要运行旧版本的客户端,并使用 -reindex-chainstate 选项来重建旧格式的链式数据结构。
 
如果你的节点已启用了修建模式,那么就需要你重新下载同步整个比特币区块链。
 
 
兼容性
 
 
Bitcoin Core客户端已在多个操作系统上进行了广泛测试,其中包括Linux 内核操作系统、macOS 10.10+、Windows 7以及更新的操作系统(Windows XP并不支持)。
 
Bitcoin Core在其他类似Unix系统的操作系统上也是可以工作的, 但测试相对较少。
 
需要注意的是,macOS操作系统低于10.10版本就无法运行0.17.0客户端,这是因为0.17.0是使用Qt 5.9.x构建的,它并不支持低于10.10版本的macOS操作系统。
 
 
显著的更改
 
 
更改配置选项
 
-includeconf=<file>可用于包含附加配置文件。它只在bitcoin.conf文件内时起作用,并不作用于包含文件或命令行。它可包含多个文件。操作者可通过命令行-noincludeconf 禁用这一功能。请注意,例如-includeconf这样的多参数命令,将覆盖掉先前的-noincludeconf 命令行;
 
noincludeconf=1 includeconf=relative.conf
 
bitcoin.conf将仍然包含relative.conf 。
 
 
更新图形用户界面
 
在主选项卡中,区块存储可在参数选择栏中进行限制。而撤消此设置,需要再次下载完整的区块链。此模式与 -txindex 以及 -rescan 是不兼容的。
 
 
外部钱包文件
 
-wallet=<path>选项现在接受了全路径,不再需要把钱包放置于-walletdir目录当中。
新创建的钱包格式
如果 -wallet=<path> 指定了一个不存在的路径,那么它现在将在指定位置创建一个钱包目录(包括一个wallet.dat数据文件,一个db.log文件以及database/log.??????????文件),而不仅仅是在路径中创建一个数据文件,并将日志文件存储在父目录当中。这使得备份钱包的操作会比以前更简单,因为指定的钱包路径可以直接归档,而不必在父目录中查找交易日志文件。
 
为了实现向后兼容,钱包路径是以-walletdir目录中现有数据文件为名,则将继续被接受,并像以前一样被解释。
 
 
钱包的动态加载及创建
 
以前,钱包只有在命令行或bitcoin.conf文件中定义-wallet 参数时,才能实现加载或创建。而现在,客户端就可实现在运行时完成钱包动态的加载、创建和卸载操作:
 


现有的钱包可通过调用 loadwallet RPC(远程过程调用)来实现加载。钱包可以指定为文件/目录名(必须位于 walletdir目录当中),或作为文件/目录的绝对路径。
新的钱包可以通过调用createwallet RPC(远程过程调用)来进行创建(或加载)。所提供的名称,必须和walletdir目录中的钱包文件或当前加载的钱包的名字差异化。
加载钱包可以通过调用unloadwallet RPC命令行实现加载;


 
此特性目前只能通过RPC接口实现。
 
 
可选交易(Coin selection)
 
 
Partial spend avoidance(部分花费规避)
 
当一个地址被用于支付多次时,来自这些分离支付的币,就可单独地进行使用,而这样会连接到其它地址,从而有损交易的隐私性。
 
而新版客户端添加了一种新的 -avoidpartialspends 操作码(默认值为false)。如果启用了这个功能,那钱包总是会把现有的UTXO汇聚到同一个地址,即使它会导致更高的费用。这样做就可以提高交易的隐私性。
 
 
测试网和RegTest 测试网络的配置部分
 
现在,单个配置文件,可实现为不同的网络设置不同的选项了。实现方法如下:
 
main.uacomment=bitcoin test.uacomment=bitcoin-testnet regtest.uacomment=regtest [main] mempoolsize=300 [test] mempoolsize=100 [regtest] mempoolsize=20
 
根据配置文件的规则,addnode=, connect=, port=, bind=, rpcport=, rpcbind= 以及 wallet= 选项将只适用于比特币主网。
 
 
钱包的‘标签’和‘账户’API
 
新版本的钱包客户端引入了一个新的‘标签-label’API。这是为了取代被弃用的‘账户-account’API。通过'-deprecatedrpc=accounts' 参数,这个‘账户’仍可在V0.17客户端当中使用,而在V0.18版本客户端中,它将被完全移除。
 
这个标签RPC方法和账户功能是非常类似的,差异在于以下这几点:
 
    标签可以在任何地址上进行设置,而不仅仅是接收地址。此功能以前仅通过GUI可用。
    标签可通过 setlabel RPC的方法,重新分配所有地址,来进行删除;
    不支持从一个标签来发送交易,也不支持确定一笔交易是从哪个标签发送而来的;
    标签没有所谓的余额;
 
以下是RPC方法的变化:
 
 
被移除的方法 新的方法 注释
 
getaccount getaddressinfo  Getaddressinfo返回了一个具有地址信息的JSON对象,而不仅仅是字符串的账户名称
 
getaccountaddress  n/a 因为标签没有关联的接收地址,所以getaccountaddress就没有替换选项了
 
getaddressesbyaccount getaddressesbylabel Getaddressesbylabel返回了一个JSON对象,其地址为密钥,而不是字符串列表
 
getreceivedbyaccount getreceivedbylabel 行为上没有发生变化
 
listaccounts  listlabels  Listlabels不会返回余额,也不会接受minconf和watchonly参数
 
listreceivedbyaccount  listreceivedbylabel 这两种方法都返回新的标签字段,以及用于向后兼容的账户字段
 
move  n/a 没有替代方法
 
sendfrom n/a 没有替代方法
 
setaccount setlabel 这两种方法都具有:1、允许将标签分配给任何地址,而不是在地址不接收地址时引发错误。2、删除与某地址相关联的先前标签,当使用该标签的最后地址被重新分配到另一个标签时。而不是进行隐式的getaccountaddress调用(确保先前的标签仍然具有一个接收地址);
 
 
更改过的方法 注释
 
addmultisigaddress 将参数account重命名为 label,如果用'-deprecatedrpc=accounts'运行,仍然接受向后兼容性的account。
 
getnewaddress 将参数account重命名为 label,如果用 '-deprecatedrpc=accounts'运行,仍然接受向后兼容性的account。
 
listunspent 返回新的标签字段,如果使用'-deprecatedrpc=accounts'运行,account字段将将返回以向后兼容。
 
sendmany 将参数account重命名为 dummy,如果提供,则这个dummy参数必须设置为空字符串,除非使用 -deprecatedrpc=accounts 参数(在这种情况下,功能不变)运行
 
listtransactions 将参数account重命名为 dummy,如果提供,则这个dummy必须设置为*字符串,除非使用 -deprecatedrpc=accounts  参数(在这种情况下,功能不变)运行。
 
getbalance account, minconf 以及include_watchonly参数被弃用了,这些参数只有在使用 '-deprecatedrpc=accounts'运行时才能够使用。
 
 
 
BIP 174 : 支持部分签名比特币交易(Partially Signed Bitcoin Transactions support)
 
 
BIP 174 PSBT 是用于尚未完全签名的比特币交易的一种交换格式,它与相关元数据一起协助对像进行签署。其旨在简化多方合作交易时的工作流程。例子包括硬件钱包、多重签名设置,以及CoinJoin交易。
 
 
整体工作流程
 
 
总体而言,一笔具有完整签名的比特币交易,其构建经历了以下步骤:
 


一名创建者(Creator)提出了一笔要创建的特定交易。它构造了一笔包含某些输入(input)和输出(output),但没有附加元数据的PSBT交易;
对于每一个输出(output),更新者(Updater)会把交易所花费的UTXO信息添加到 PSBT交易当中;
潜在的其他更新者,会把每一个输入(以及可能的输出)中所涉及的脚本和公钥信息添加到PSBT交易当中;
签名者(Signers)会检查这笔PSBT交易及其元数据,然后决定是否同意交易。它们可以使用UTXO当中的数量信息来评估所涉及的价值和费用。如果同意,它们就会为具有相关密钥的输入,生产一个部分签名(partial signature)。
决策者(Finalizer)会把关每一个输入,并转换这个部分签名,并可能把脚本信息写入最终的scriptSig 以及/或scriptWitness 。
提取者(Extractor )会从一笔PSBT交易当中,提取并生产出一笔有效的比特币交易。


 
一般来说,上面的每一个参与者(不包括创建者和提取者)会简单地把越来越多的数据添加到特定的PSBT交易当中。在简单的工作流程当中,它们必须按顺序操作,将 PSBT交易从一方传递到下一方,直到提取者(Extractor )可以将其转换为一笔真正的比特币交易。为了允许并行操作,组合者(Combiners)可以把不同的PSBT交易的元数据合并到同一个未签名的交易当中。
 
上面使用粗体所表示的名称,是BIP174中定义角色的名称。这对于理解底层步骤很有用,但在实践过程中,软件和硬件通常同时担任了多个角色。
 
 
RPC
 


converttopsbt (创建者)是一个功能性RPC,它将未签名的原始交易转换为PSBT格式,其忽略了现有签名。
createpsbt(创建者)是一个功能性RPC,它负责获取输入和输出列表,并把它们转换为没有附加信息的PSBT,其相当于在converttopsbt之后调用createrawtransaction
walletcreatefundedpsbt (创建者, 更新者) 是一个钱包RPC,它负责创建具有指定输入和输出的PSTB,并向其添加额外的输入,更改以平衡之,并添加相关的元数据。
walletprocesspsbt(更新者,签名者,决策者)是一个钱包RPC,它负责接受PSBT作为输入,将UTXO、密钥和脚本数据添加到那些错过它的输入和输出当中,并可选地对输入进行签名。在可能的情况下,它也能够完成部分签名;
finalizepsbt (决策者,提取者)是一个功能性RPC,它用于完成任何部分签名,如果所有的输入都已完成,则将结果转换为完全签名的交易,该交易可以通过sendrawtransaction 进行广播;
combinepsbt (组合者)是一个功能性RPC,它的作用就是作为一个组合者,它可以在任何工作流程的任何时间点使用,其可以将信息添加到同一PSBT的不同版本当中。特别地,它对于多个更新者或签名者输出的组合而言,是有用的。
decodepsbt是一个诊断型RPC,它可以用于显示PSBT交易中所有的信息,并计算它的最终费用。


 
 
将非HD钱包升级为HD钱包
 
 
自Bitcoin Core 0.13.0版本客户端发布以来,Bitcoin Core 就可以支持创建新的BIP 32 分层确定性(HD)钱包,但旧的非HD钱包无法升级到HD钱包。现在,我们可通过-upgradewallet 命令行选项将非HD钱包升级到HD钱包。这一升级,将导致密钥池中的所有密钥会被标记为已使用,并生成新的密钥池。执行此升级时,操作者必须做好钱包备份。
 
此外,-upgradewallet命令行还可以把非分裂HD链(用m/0'/0'/i'生成的所有密钥)升级到一个分裂HD链(接收用 'm/0'/0'/i'生成的密钥,以及用m'/0'/1'/i'生成的更改密钥)。当发生此升级时,密钥池中已有的所有密钥,将保留在密钥池中以供使用,直到升级前所有的密钥被耗尽。这是为了避免备份及降级的问题(当一些密钥可能来自更改密钥池时)。用户们可以使用newkeypool RPC 命令行来使用新的分裂HD链密钥池,来标记密钥池中已使用的所有密钥,并开始使用这个分裂HD链中生成的新密钥池。
 
 
HD 主密钥控制
 
 
一个新的RPC sethdseed 已被引入到客户端当中,它允许用户设置新的HD种子,或设置自己的HD种子。需要注意的是,在设置新的HD种子时,用户必须进行新的备份。
 
 
重要性较低的 RPC更改
 


createrawtransaction RPC 现在将为outputs参数接受数组(array)或dictionary (保持兼容性),这意味着交易输出顺序,可以由客户端指定。
fundrawtransaction RPC 将拒绝先前被否定的 reserveChangeKey 选项;
sendmany 将负责打乱输出(output)以改善隐私性,因此,任何先前预期的关于输出排序的行为都变得不可靠了;
新的testmempoolaccept RPC ,可用来测试在不添加一笔交易的情况下,看其是否会被交易储蓄池(mempool)所接受;
JSON交易分解现在包括了一个权重字段,其它提供了交易的确切权重。在JSON模式下,它将纳入REST /rest/tx/ 以及/rest/block/ 端点中。它也会包含于getblock (verbosity=2),listsinceblock,listtransactions, 以及getrawtransaction RPC命令中。
新的fees字段将引入getrawmempool,getmempoolancestors, getmempooldescendants 以及 getmempoolentry,当子字段 ancestor, base, modified 以及 descendant以BTC计价,verbosity设置为 true时。这个新的字段会否定先前的费用字段,例如fee, modifiedfee, ancestorfee 以及 descendantfee;
新的RPC getzmqnotifications 会返回有关活跃ZMQ通知的信息。
当比特币并不以任何-wallet=<path>选项启动时,由getwalletinfo和listwallets 这两个RPC所返回的默认钱包名现在会是空字符串 "" ,而不是先前的"wallet.dat" 。如果是通过-wallet=<path>选项启动的,则和以前没有变化,任何钱包的名称只是其<path>字符串。
现在,将一个空字符串("") 作为address_type参数传递给getnewaddress, getrawchangeaddress, addmultisigaddress, fundrawtransaction RPC 会是一个错误。以前,这将回到使用默认地址类型。它仍然可以传递空字符串或将未设置的参数保留为使用默认地址类型。
空的多重签名输出,将不再自动被当做传入支付。由于此功能仅适用于多重签名输出,也就是你拥有钱包当中所有私钥的情况。与单个密钥方案相比,这通常没有什么用处。此外,当前并没有定义这样的输出地址格式,并且钱包软件不能很容易地发送给它。listtransactions,listunspent 命令行将不再显示这些输出,这些输出也不会和你余额有关,除非它们被明确监视(用十六进制脚本参数importaddress或importmulti,signrawtransaction*也可以使用)。
getwalletinfo RPC 现在会返回一个hdseedid值,它始终与不正确命名的hdmasterkeyid值相同。hdmasterkeyid将在V0.18版本客户端中被删除。


 
 
其他API更改
 
 
在dumpwallet 输出中的inactivehdmaster 已被更改为inactivehdseed
 
 
日志
 


日志时间戳的格式现在是ISO 8601 (例如"2018-02-28T12:34:56Z")。
当运行带有 -debug,而没有-daemon的bitcoind时,记录stdout现在就成为了默认行为。设置-printtoconsole=1 不再隐含地禁止记录到debug.log。相反,我们可通过设置-debuglogfile=0 来显式禁用记录到文件。


 
 
交易索引变化
 
 
交易索引现在和主节点过程分开构建,这意味着 -txindex 操作码,可在没有完全重新索引的情况下进行toggled切换。如果bitcoind是用-txindex 在一个已部分或完全同步的节点上运行的,则交易索引可在后台建立,并且一旦被捕获就可使用。当从运行-txindex,切换到不带这一flag的运行时,交易索引数据库将不会自动被删除,这意味着,我们可以在稍后的时间里重新打开它,而无需重新同步。
 
 
区块限制功能
 
 
在V0.15.1客户端当中,允许矿工限制其区块大小的-blockmaxsize 选项遭到了反对,现在这个选项被移除掉了。如果矿工们想要限制区块的大小,他们应使用-blockmaxweight 这个选项。
 
 
中断对Python  2.0的支持
 
 
对于所有测试文件及工具而言,新版本的客户端对Python 2.0的支持已经中断。
 
最后,感谢所有对该版本比特币客户端作出直接贡献的人,也感谢帮助翻译的每一个人。
 
 
原文:0.17.0 Release notes
作者:Bitcoin core开发组
编译:洒脱喜

0 个评论

要回复文章请先登录注册