【翻译】 Bitcoin Core 0.15.0版本说明
原文:https://bitcoin.org/en/release/v0.15.0
译者:中山大学数学学院(珠海)林学渊
大二时给量子做的翻译,转载注明出处,谢谢
0.15.0版本说明
当前对隔离见证的支持
版本0.15.0支持通过 addwitnessaddress
RPC 添加隔离见证地址,但请注意,这是一个 测试/专家 RPC,它不保证从备份恢复。 要是你知道你在做什么,就使用这个 RPC 吧。下一个版本将提供更完整的隔离见证的钱包支持。
加密钱包重新扫描
和以前的版本一样,当使用加密的 HD 钱包时,如果没有解锁钱包,密钥池不会被自动检测。 这意味着,目前,如果要从加密 HD 钱包的备份恢复,用户必须用非常长的时间解锁钱包并手动触发重新扫描,否则当自动检测程序无法运行时,会有可能丢失一些密钥。 不幸的是,在这个版本中没有 rescan
RPC,它放在以后的版本中。所以现在重新扫描可以使用其中一个 import*
命令触发,同时要用另一个(可信)钱包生成的虚拟地址。
重大改动
性能改进
版本0.15包含许多重要的性能改进,这使得初始块下载,启动,交易和块验证速度更快:
- 链状态数据库 (用于跟踪 UTXO ) 已从每交易模型更改为每交易输出模型(请查看 PR 10195)。 这个模型的优点是它:
- 避免反序列化和序列化未使用输出的CPU开销;
- 更可预测的内存使用情况;
- 更简单的代码;
- 适用于各种未来的缓存刷新策略。
因此,在初始块下载(IBD)和重新索引期间验证区块链的速度提高约30-40%,使用的内存减少10-20%,并且刷新到磁盘的频率要更低。 唯一的缺点是磁盘上的数据库大小增加15%。 在从以前的格式转换过来的过程中,可能会使用额外几千兆字节。
- 早期版本在刷新 UTXO 到磁盘时遇到了内存使用量激增。 结果,实际只有一半的可用内存用作缓存,而另一半则被保留以应付数据刷新。 不会再有这种情况了(请查看 PR 10148),并且整个可用缓存(请查看
-dbcache
)现在确实用作缓存。 这将数据刷新频率降低了2倍甚至更多。 - 在前面的版本中, 当交易被内存池接受时,交易的签名验证会被缓存。版本 0.15 版本0.15将其有效性扩展为缓存整个脚本(请查看 PR 10192)。 这意味着如果块中的交易已被内存池接受,私钥签名不需要重新计算。 经验测试表明,这使新块的验证速度提高40-50%。
- LevelDB 已经升级到版本1.20 (请查看 PR 10544). 这个版本包括用于在支持SSE 4.2的体系结构中 CRC 的硬件加速 。因此,同步和块验证现在更快。
- 针对支持SSE 4的体系结构(参见 PR 10821),SHA256哈希已优化。 在支持的硬件上 SHA256 速度提高了约50%,这导致IBD和块验证速度提高了约5%。 在版本0.15中,默认情况下,发布版本中禁用SHA256硬件优化,但可以在构建时使用
--enable-experimental-asm
启用。 - 重新填充密钥池不再刷新每个密钥对应的钱包,使创建新钱包的速度提高了20倍。 部分加速用来将默认密钥池增加到1000个密钥,以使恢复能力更加健壮。(见 PR 10831).
手续费评估的改进
版本0.15中,手续费评估速度有了明显提高,钱包使用的手续费评估更准确,而对于estimatesmartfee
和 estimaterawfee
RPC(见 PR 10199)的高级用户而言,手续费评估的可选范围更广。
内部逻辑和钱包行为的变化
- 手续费评估现在在3个不同的时间范围内进行跟踪。这使更长远的目标和评估方法能更迅速地适应条件的变化。
- 评估现在可以选择 保守的 或 经济的。 保守评估使用更长的时间范围来产生评估,不易受费用条件快速变化影响。经济评估使用更短的时间范围,受费用条件的短期变化影响更大。 在低交易活动期间(例如在周末),经济评估可能会相当低,但如果通行费用迅速增加,则可能导致交易未被证实。
- 默认,钱包使用保守的手续费评估来增加在预期目标内被确认的交易的可靠性。对于被标记为可替换的交易,钱包默认会使用经济评估,因为如果费用条件迅速变化,费用可能会“冲突” (查看 PR 10589).
- 现在可以对最多1008个块的确认目标进行评估(一周内)。
- 存储更多关于历史收费率的数据,从而使手续费评估更精确。
- 对由于驱逐或其他未确认的原因而离开内存池的交易,不再考虑手续费评估,使手续费评估更准确。
- 手续费评估逻辑将确保收集到足够的数据以返回有意义的估算值。 如果数据不足,则使用后备的默认费用。
手续费评估 RPC 的变化
estimatefee
RPC 现在废弃了,建议使用estimatesmartfee
(支持 GUI)estimatesmartfee
RPC 接口改变 (查看 PR 10707):nblocks
参数重命名成conf_target
(与其他RPC方法一致).- 增加
estimate_mode
参数. 该参数为以下字符串之一:CONSERVATIVE
,ECONOMICAL
或UNSET
(默认是CONSERVATIVE
). - RPC返回对象现在包含一个
error
成员,它返回处理期间遇到的错误。 - 如果 Bitcoin Core 运行时间不够长,并且没有足够的数据块或交易来产生准确的手续费评估,则会返回一个错误(之前使用-1表示错误,这可能会导致费率混淆)。
- 新增
estimaterawfee
RPC 提供原始费用数据. 外部客户端可以在他们自己的手续费评估逻辑中查询和使用这些数据。
多钱包支持
Bitcoin Core现在支持加载多个独立钱包 (查看 PR 8694, PR 10849).钱包是完全分开的,具有个人余额,钥匙和收到的交易.
启动比特币时使用 -wallet
参数可启用多钱包,在命令行或比特币配置文件中都可以。
在Bitcoin-Qt中,只有第一个钱包才会显示并可用于创建和签署交易。 未来版本将支持 GUI 来选多个钱包。 但是,即使在版本0.15的其他加载的钱包中,仍然会与后台节点的当前提示保持同步。 这可能很有用,如果是运行一个修剪过的节点的话,因为加载一个最新同步超出修剪高度的钱包导致必须下载并重新验证整个区块链。 继续同步后台中的所有钱包可避免此问题。
Bitcoin Core 0.15.0 包括下列RPC接口的改动及多钱包的 bitcoin-cli
:
- 当用一个钱包运行 Bitcoin Core 时,RPC 接口或
bitcoin-cli
不会 变化。所有 RPC 调用和bitcoin-cli
命令和之前一样继续运行. - 当用多钱包运行 Bitcoin Core 时, 所有 节点级 RPC 方法和之前一样继续运行. HTTP RPC 请求应该发送至
<RPC IP address>:<RPC port>
, 并且bitcoin-cli
命令应该和之前一样继续运行. 一个 节点级 RPC 方法是不需要访问钱包的任意方法。 - 当用多钱包运行 Bitcoin Core 时, 钱包级 RPC 方法必须指定他们在每个请求中所针对的钱包。 HTTP RPC 请求应该发送至
<RPC IP address>:<RPC port>/wallet/<wallet name>
, 例如127.0.0.1:8332/wallet/wallet1.dat
.bitcoin-cli
命令应该使用-rpcwallet
选项运行, 例如bitcoin-cli -rpcwallet=wallet1.dat getbalance
. - 添加了一个新的 节点级
listwallets
RPC 方法来显示当前加载哪些钱包。 此方法返回的名称与HTTP端点和rpcwallet
参数中使用的名称相同。
请注意,虽然现在完全支持多钱包,但对于版本0.15.0,RPC多钱包界面应被视为不稳定,并且未来版本中可能存在向后不兼容的更改。
在GUI中 RBF(replace-by-fee)控制
Bitcoin Core 支持从版本0.12.0开始创建 replace-by-fee(RBF)交易,并且自0.14.0版本开始包含一个 bumpfee
RPC 方法,用支付更高费用的新交易取代未经证实的选择性RBF交易。
在版本0.15中,创建一个选择性的RBF交易,和用更高费用的交易替换未确认的交易都在GUI中支持(见 PR 9592).
移除币龄优先
Bitcoin Core前面的版本中, 每块的一部分可以根据他们花费的 UTXO 的年龄和价值预留给交易。 这个概念(币龄优先)是矿工的一项政策选择,并且没有围绕包括币龄优先交易的共识规则。 在实践中,只有少数矿工继续使用币龄优先进行交易。 Bitcoin Core 0.15删除了币龄优先的所有支持(见 PR 9602)。 这具有以下意义:
- 免费交易 的概念已被移除。即使没有附加矿工费,高币龄优先交易也会允许进行转账。 这是不可能的,因为不再有币龄优先的概念。 控制免费交易的
-limitfreerelay
和-relaypriority
选项已被移除。 -sendfreetransactions
选项已被移除, 因为几乎所有的矿工都不要不附加交易费的交易。-blockprioritysize
选项已被移除.estimatepriority
和estimatesmartpriority
RPCs 已被移除.getmempoolancestors
,getmempooldescendants
,getmempoolentry
和getrawmempool
RPCs 不再返回startingpriority
和currentpriority
.prioritisetransaction
RPC 不再有priority_delta
参数, 它替换成dummy
参数,以便与使用位置参数的客户端向后兼容。 RPC 仍然适用于通过使用fee_delta
参数来改变交易的明显费率。-minrelaytxfee
现在可以设为 0. 如果设置了minrelaytxfee
, 那么小于minrelaytxfee
(每 kB) 的费用拒绝中继,挖掘和创建交易。默认为1000 satoshi / kB。-printpriority
选项升级为只在挖矿代码输出费率和包含在块中的交易哈希.
内存池持久化重启
版本0.14 引入了内存池持久化重启(内存池在关闭之前保存到数据目录中的 mempool.dat
文件中,并在节点重新启动时恢复内存池)。 版本0.15允许使用-persistmempool
命令行选项打开或关闭此功能(请参阅 PR 9966)。 默认情况下,该选项设置为true,内存池在关机时保存并在启动时重新加载。 如果设置为false,则 mempool.dat
文件将不会在启动时加载或在关闭时保存。
新 RPC 方法
版本 0.15 引入一些新的 RPC 方法:
abortrescan
停止当前钱包的重新扫描, 比如,在被一个importprivkey
调用触发时 (查看 PR 10208).combinerawtransaction
接受一个原始交易的JSON数组,将它们组合成一个原始交易 (查看 PR 10571).estimaterawfee
返回原始费用数据,以便可以使用定制的逻辑来分析数据并计算估算值。 有关费用估算逻辑和接口更改的完整详细信息,请参阅 手续费评估的改进getchaintxstats
返回关于链中交易总数和速率的统计信息(查看 PR 9733).listwallets
列出当前加载的钱包。查看多钱包 ( 多钱包支持) 获得更多细节。uptime
返回自上次启动以来bitcoind
服务器的总运行时间 (查看 PR 10400).
底层 RPC 更改
在使用 Bitcoin Core 的多钱包模式时, 钱包方法的RPC请求必须指定它们的用途。 有关完整的详细信息,请参阅 多钱包支持 。
新的数据库模型不再存储关于未使用输出的交易版本的信息(请参阅 性能改进). 这意味着:
gettxout
RPC 的返回不再有version
字段.gettxoutsetinfo
RPC 报告hash_serialized_2
而不是hash_serialized
, 后者没有提交未使用输出的交易版本,但确实提交了高度和coinbase 信息。getutxos
REST 路径不再以JSON格式报告txvers
字段。
始终以二进制格式报告交易版本为0。
estimatefee
RPC 废弃. 用户应该转向使用estimatedmartfee
RPC,这会返回更好的费用估算。查看 手续费评估的改进 详细了解费用估算逻辑和接口的变化。gettxoutsetinfo
的返回现在包含disk_size
和bogosize
而不是bytes_serialized
。第一个是对实际磁盘使用情况的更准确的估计,但不是确定性的。 第二个与磁盘使用无关,但也与UTXO集大小无关,与数据库无关:它将每个UTXO条目计数为 50 + 其scriptPubKey长度 (查看 PR 10426).signrawtransaction
不能再用于将多个交易组合为单个交易. 作为替代, 使用新的combinerawtransaction
RPC (查看 PR 10571).fundrawtransaction
不再接受一个reserveChangeKey
选项. 此选项用于允许 RPC 用户使用密钥池中的密钥为更改地址提供原始交易处理,而无需将其从密钥池中的可用密钥中移除。密匙能重用,通过调用getnewaddress
, 但这可能会导致混淆或危险的行为 (查看 PR 10784).estimatepriority
和estimatesmartpriority
已被移除. 查看 移除币龄优先.listunspent
RPC 现在可以接受一个query_options
参数 (查看 PR 8952), 它是一个包含一个或多个以下成员的JSON字段:minimumAmount
- 一个数字,指定每个UTXO的最小值maximumAmount
- 一个数字,指定每个UTXO的最大值maximumCount
- 一个数字,指定UTXO的最小数量minimumSumAmount
- 一个数字,指定UTXO的最大数量
getmempoolancestors
,getmempooldescendants
,getmempoolentry
和getrawmempool
RPCs 不再返回startingpriority
和currentpriority
. 查看 移除币龄优先.dumpwallet
RPC 现在返回虚拟钱包(dumped wallet)的完整绝对路径. 即使成功,它也不会返回任何值 (查看 PR 9740).
getpeerinfo
RPC中, 每个peer的返回对象现在返回一个addrbind
成员,其中包含到peer的连接的IP地址和端口。 这是除了包含本地节点的IP地址和端口的addrlocal
成员之外,由peer方报告的成员 (查看 PR 10478).disconnectnode
RPC 现在可以断开由节点ID(以及IP地址/端口)指定的节点。 要根据节点ID断开节点,请使用新的nodeid
参数 (查看 PR 10143).prioritisetransaction
的第二个参数已经从priority_delta
重命名成dummy
,因为 Bitcoin Core 不再有币龄优先的概念。dummy
参数没有功能影响,但为了兼容性保留位置。查看 移除币龄优先.resendwallettransactions
RPC 抛出错误如果-walletbroadcast
选项设置为 false (查看 PR 10995).submitblock
RPC 的第二个参数从parameters
重命名为dummy
. 这个参数从来没有任何效果,重命名只是将这个事实传达给用户 (查看 PR 10191)
(用户应该,无论如何,使用submitblock
的位置参数以便与BIP 22兼容。)getblock
的verbose
参数重命名成verbosity
,现在接受 0 到 2 的int整数. verbose等级0等同于verbose=false
。 verbose等级1相当于verbose=true
. Verbose 等级 2 将给出由getrawtransaction
给出的输出中每个交易的完整交易详情。为了兼容性,仍旧保留使用详细命名参数和布尔值的旧行为。- 错误代码已更新为更准确的以下错误情况 (查看 PR 9853):
getblock
现在返回 RPC_MISC_ERROR 如果区块在硬盘上找不到 (比如如果区块被修剪). 之前返回 RPC_INTERNAL_ERROR.pruneblockchain
现在返回 RPC_MISC_ERROR 如果由于节点不是处于修剪模式而无法修剪区块。 之前返回 RPC_METHOD_NOT_FOUND.pruneblockchain
现在返回 RPC_INVALID_PARAMETER 如果由于提供的时间戳太晚了而无法修剪区块. 之前返回 RPC_INTERNAL_ERROR.pruneblockchain
现在返回 RPC_MISC_ERROR 如果由于区块链太短而无法修剪区块. 之前返回 RPC_INTERNAL_ERROR.setban
现在返回 RPC_CLIENT_INVALID_IP_OR_SUBNET if the supplied IP address
or subnet is invalid. 之前返回 RPC_CLIENT_NODE_ALREADY_ADDED.setban
现在返回 RPC_CLIENT_INVALID_IP_OR_SUBNET 如果提供的IP地址或子网无效. 之前返回 RPC_MISC_ERROR.removeprunedfunds
现在返回 RPC_WALLET_ERROR 如果bitcoind
无法移除交易. 之前返回 RPC_INTERNAL_ERROR.removeprunedfunds
现在返回 RPC_INVALID_PARAMETER 如果在钱包中交易不存在. 之前返回 RPC_INTERNAL_ERROR.fundrawtransaction
现在返回 RPC_INVALID_ADDRESS_OR_KEY 如果提供了无效的更改地址. 之前返回 RPC_INVALID_PARAMETER.fundrawtransaction
现在返回 RPC_WALLET_ERROR 如果bitcoind
不能创建一个交易. 错误消息提供了更多详细信息。. 之前返回 RPC_INTERNAL_ERROR.bumpfee
现在返回 RPC_INVALID_PARAMETER 如果提供的交易在钱包中有后代. 之前返回 RPC_MISC_ERROR.bumpfee
现在返回 RPC_INVALID_PARAMETER 如果提供的交易在内存池中有后代. 之前返回 RPC_MISC_ERROR.bumpfee
现在返回 RPC_WALLET_ERROR 如果提供的交易已被开采或与挖矿交易发生冲突. 之前返回 RPC_INVALID_ADDRESS_OR_KEY.bumpfee
现在返回 RPC_WALLET_ERROR 如果提供的交易不是BIP 125可替换. 之前返回 RPC_INVALID_ADDRESS_OR_KEY.bumpfee
现在返回 RPC_WALLET_ERROR 如果提供的交易已经被不同的交易冲突. 之前返回 RPC_INVALID_REQUEST.bumpfee
现在返回 RPC_WALLET_ERROR 如果提供的交易包含不属于该钱包的输入. 之前返回 RPC_INVALID_ADDRESS_OR_KEY.bumpfee
现在返回 RPC_WALLET_ERROR 如果提供的交易有多个变更输出. 之前返回 RPC_MISC_ERROR.bumpfee
现在返回 RPC_WALLET_ERROR 如果提供的交易没有变化输出. 之前返回 RPC_MISC_ERROR.bumpfee
现在返回 RPC_WALLET_ERROR 如果手续费太高. 之前返回RPC_MISC_ERROR.bumpfee
现在返回 RPC_WALLET_ERROR 如果手续费太低. 之前返回RPC_MISC_ERROR.bumpfee
现在返回 RPC_WALLET_ERROR 如果变化的产出太小而不能收费. 之前返回 RPC_MISC_ERROR.