比特币中的rpc服务
Ⅰ bitcoin mining详解
mining总共可以分为两种,一种是: Solo Mining ;一种是: Pool Mining
如下图所示,solo miner 使用 bibtcoind 来从网络上面来拿到新的交易。 通过使用 getblocktemplate 这个RPC命令去定期轮询 bitcoind 来获取新的交易。
挖矿的时候,首先去构造一个80字节的块头结构。 之后遍历块头中的nonce字段来生成与其对应的hash值。
挖矿的时候,我们需要两个点,一个是去构造coinbase,另一个是回填块头结构的nonce值。当块头结构构造好之后,就会返回给client端。
上述过程也就是去折腾80字节的块头结构:
这种挖矿的形式就是我每一个人贡献我自己的算力,然后大家的算力加起来,合成一个矿池,现在由我矿池统一挖矿,挖到块之后,按照大家算力的百分比分成。
上面我们提到了,挖矿就是折腾那80字节,现在我们具体看看怎么折腾。
4 字节的nVersion字段,这个我们可以认为它是不变的,为什么这么说,因为这个字段只有在进行升级时候才会改变,平时没事也不升级啊。
32字节的hashPrevBlock字段,这个是不变的,它是由前一个区块确定的,你没办法改变它。
4字节的nBits字段,这个也基本是不变的,它由全网的算力决定,每2016个块才会进行一次难度调整,调整的算法是固定的。
上述三个字段我们基本认为不会变,也就是在构造80字节的块头的时候,和你们没什么大的关系。
4字节的nTime,这个字段是可变的,但悲哀的是,蹦跶的范围不大,理论上是允许后一个区块的区块时间略早于前一个区块时间,所以看到你的“父亲”出生的比你晚不必要惊讶,全网太大了,网络稍微有点延迟,这个东西也没办法避免,一般来说,矿工会直接使用机器当前时间戳。
4字节的nNonce,这个字段好好唠唠,一个字节8位,4字节32位,所以,它能提供2的32次方的寻址范围。在CPU和GPU的挖矿时代,这个字段也就足够用了,所以当时候都是去迭代遍历这个nNonce字段,算出来复合要求的值,回去填充块头。但是随着算力的提升,4GB的寻址肯定不够用了,怎么办呢?
32自己的hashMerkleRoot字段,merkle tree具体的作用就不在这里展开说明了,该字段是矿工构造的coinbase加上这个块打包进来的所有交易,算出来的一个32字节的hash‘值,只要包括coinbase字段在内的所有交易有任何风吹草动,该字段都会不一样。32字节啊,也就是说提供了2的256次方的寻址可能,目前世界上现存的所有算力全部加起来也算不完吧,如果量子计算落地,另当别论。
综上所述,挖矿流程我们可以简单总结如下:
Ⅱ BitCoinCore配置文件解读
bitcoin.conf 配置文件
除了 -datadir 和 -conf 以外的所有命令行参数都可以通过一个配置文件来设置,而所有配置文件中的选项也都可以在命令行中设置。命令行参数设置的值会覆盖配置文件中的设置。
配置文件是“设置=值”格式的一个列表,每行一个。您还可以使用 # 符号来编写注释。
配置文件不会自动创建;您可以使用您喜爱的纯文本编辑器来创建它。默认情况下,Bitcoin(或 bitcoind)会在比特币数据文件夹下查找一个名为“bitcoin.conf”的文件,但是数据文件夹和配置文件的路径都可以分别通过 -datadir 和 -conf 命令行参数分别指定。
bitcoin.conf位置
操作系统 默认数据文件夹 配置文件路径
Windows %APPDATA%\Bitcoin\ (XP) C:\Documents and Settings\username\Application Data\Bitcoin\bitcoin.conf
(Vista, 7) C:\Users\username\AppData\Roaming\Bitcoin\bitcoin.conf
Linux $HOME/.bitcoin/ /home/username/.bitcoin/bitcoin.conf
Mac OSX $HOME/Library/Application Support/Bitcoin/ /Users/username/Library/Application Support/Bitcoin/bitcoin.conf
bitcoin.conf 示例
# bitcoin.conf 配置文件。以 # 开头的行是注释。
# 网络相关的设置:
# 在测试网络中运行,而不是在真正的比特币网络
#testnet=0
# 通过一个 Socks4 代理服务器连接
#proxy=127.0.0.1:9050
##############################################################
## addnode 与 connect 的区别 ##
## ##
## 假设您使用了 addnode=4.2.2.4 参数,那么 addnode 便会与 ##
## 您的节点连接,并且告知您的节点所有与它相连接的其它节点。 ##
## 另外它还会将您的节点信息告知与其相连接的其它节点,这样它 ##
## 们也可以连接到您的节点。 ##
## ##
## connect 在您的节点“连接”到它的时候并不会做上述工作。仅 ##
## 它会与您连接,而其它节点不会。 ##
## ##
## 因此如果您位于防火墙后,或者因为其它原因无法找到节点,则 ##
## 使用“addnode”添加一些节点。 ##
## ##
## 如果您想保证隐私,使用“connect”连接到那些您可以“信任” ##
## 的节点。 ##
## ##
## 如果您在一个局域网内运行了多个节点,您不需要让它们建立许多 ##
## 连接。您只需要使用“connect”让它们统一连接到一个已端口转 ##
## 发并拥有多个连接的节点。 ##
##############################################################
# 您可以在下面使用多个 addnode= 设置来连接到指定的节点
#addnode=69.164.218.197
#addnode=10.0.0.2:8333
# ... 或使用多个 connect= 设置来仅连接到指定的节点
#connect=69.164.218.197
#connect=10.0.0.1:8333
# 不使用因特网中继聊天(IRC)(irc.lfnet.org #bitcoin 频道)
# 来查找其它节点
#noirc=0
# 入站+出站的最大连接数
#maxconnections=
# JSON-RPC 选项(用于控制运行中的 Bitcoin/bitcoind 进程):
# server=1 告知 Bitcoin-QT 接受 JSON-RPC 命令
#server=0
# 您必须设置 rpcuser 和 rpcpassword 以确保 JSON-RPC 的安全
#rpcuser=Ulysseys
#rpcpassword=YourSuperGreatPasswordNumber_DO_NOT_USE_THIS_OR_YOU_WILL_GET_ROBBED_38559
# 客户端在 HTTP 连接建立后,等待多少秒以完成一个 RPC HTTP 请求
#rpctimeout=30
# 默认仅允许来自本机的 RPC 连接。在这里您可以指定多个
# rpcallowip=,来设置您想允许连接的其它主机 IP 地址。
# 您可以使用 * 作为通配符。
#rpcallowip=10.1.1.34
#rpcallowip=192.168.1.*
# 在如下端口监听 RPC 连接
#rpcport=8332
# 您可以通过如下设置使用 Bitcoin 或 bitcoind 来发送命令到一个在
# 其它主机远程运行的 Bitcoin/bitcoind 客户端
#rpcconnect=127.0.0.1
# 使用安全套接层(也称为 TLS 或 HTTPS)来
# 连接到 Bitcoin -server 或 bitcoind
#rpcssl=1
# 当 rpcssl=1 时使用的 OpenSSL 设置
#rpcsslciphers=TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH
#rpcsslcertificatechainfile=server.cert
#rpcsslprivatekeyfile=server.pem
# 其它选项:
# 设置 gen=1 以尝试生成比特币(采矿)
#gen=0
# 预生成如下数目的公匙和私匙,这样钱包备份便可以对已有的交易以及未来
# 多笔交易有效
#keypool=100
# 每次您发送比特币的时候支付一个可选的额外的交易手续费。包含手续费的交易
# 会更快的被包含在新生成的货币块中,因此会更快生效
#paytxfee=0.00
# 允许直接连接,实现“通过 IP 地址支付”功能
#allowreceivebyip=1
# 用户界面选项:
# 最小化启动比特币客户端
#min=1
# 最小化到系统托盘
#minimizetotray=1
Ⅲ 比特币基础知识 你绝对想不到
椭圆曲线数字签名算法
椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线对数字签名算法(DSA)的模拟,该算法是构成比特币系统的基石。
私钥
非公开,拥有者需安全保管。通常是由随机算法生成的,说白了,就是一个巨大的随机整数,32字节,256位。
大小介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间的数,都可以认为是一个合法的私钥。
于是,除了随机方法外,采用特定算法由固定的输入,得到32字节输出的算法就可以成为得到私钥的方法。于是,便有了迷你私钥(Mini Privkey),原理很简单,例如,采用SHA256的一种实现:
private key = SHA256()1
迷你私钥存在安全问题,因为输入集合太小,易被构造常见组合的彩虹表暴力破解,所以通常仿轮纳还是使用系统随机生成的比较好,无安全隐患。
公钥
公钥与私钥是相对应的,一把私钥可以推出唯一的公钥,但公钥却无法推导出私钥。公钥有两种形式:压缩与非压缩。
早期比特币均使用非压缩公钥,现大部分客户端已默认使用压缩公钥。
这个貌似是比特币系统一个长得像feature的bug,早期人少活多代码写得不够精细,openssl库的文档又不足够好,导致Satoshi以为必须使用非压缩的完整公钥,后来大家发现其实公钥的左右两个32字节是有关联的,左侧(X)可以推出右侧(Y)的平方值,有左侧(X)就可以了。
现在系统里两种方式共存,应该会一直共存下去。两种公钥的首个字节为标识位,压缩为33字节,非压缩为65字节。以0x04开头为非压缩,0x02/0x03开头为压缩公钥,0x02/0x03的选取由右侧Y开方后的奇偶决定。
压缩形式可以减小Tx/Block的体积,每个Tx Input减少32字节。
签名
使用私钥对数据进行签署(Sign)会得到签名(Signature)。通常会将数据先生成Hash值,然后对此Hash值进行签名。签名(signature)有两部分组成: R + S。由签名(signature)与Hash值,便可以推出一个公钥,验证此公钥,便可知道此签名是否由公钥对应的私钥签名。
通常,每个签名会有三个长度:73、72、71,符合校验的概率为25%、50%、25%。所以每次签署后,需要找出符合校验的签名长度,再提供给验证方。
地址
地址是为了人们交换方便而弄出来的一个方案,因为公钥太长了(130字符串或66字符串)。地址长度为25字节,转为base58编码后,为34或35个字符。base58是类似base64的编码,但去掉了易引起视觉混淆的字符,又在地址末尾添加了4个字节校验位,保障在人们交换个别字符错误时,也能够因地址校验失败而制止了误操作。
由于存在公钥有两种形式,那么一个公钥便对应两个地址。这两个地址都可由同一私钥签署交易。
公钥生成地址的算法:
Version = 1 byte of 0 (zero); on the test network, this is 1 byte of 111
Key hash = Version concatenated with RIPEMD-160(SHA-256(public key))
Checksum = 1st 4 bytes of SHA-256(SHA-256(Key hash))
Bitcoin Address = Base58Encode(Key hash concatenated with Checksum)1234
下图是非压缩公钥生成地址的过程:
对于压缩公钥生成地址时,则只取公钥的X部分即可。
推导关系
三者推导关系:私钥
公钥
两个地址。过程均不可逆。拥有私钥便拥有一切,但通常为了方便,会把对应的公钥、地址也存储起来。
交易
比特币的交易(Transation,缩写Tx),并不是通常意义的桐散交易,例如一手交钱一手交货,而是转账。交易由N个输入和M个输出两部分组成。交易的每个输入便是前向交易的某个输出,那么追踪到源头,必然出现一个没有输入的交易,此类交易称为CoinBase Tx。CoinBase类备没交易是奖励挖矿者而产生的交易,该交易总是位于Block块的第一笔。
拥有一个输入与输出的Tx数据:
Input:
Previous tx:
Index: 0
scriptSig:
241501
Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160
OP_EQUALVERIFY OP_CHECKSIG12345678910
一旦某个Tx的第N个输出成为另一个Tx的输入,那么该笔比特币即为已花费。每个交易有唯一Hash字符串来标识,通过对交易数据做两次SHA256哈希运算而来:
Tx Hash ID = SHA256(SHA256(Tx Data))1
矿工费
矿工费(Transaction Fee)是鼓励矿工将Tx打包进Block的激励报酬。计算一笔交易的矿工费:
Transaction Fee = SUM(Inputs amount) - SUM(Outputs amount)1
每笔Tx的矿工费必然大于等于零,否则该笔Tx即为非法,不会被网络接收。
数据块
数据块(Block)是存储Block Meta与Tx的地方。Block的第一笔Tx总是CoinBase Tx,因此Block中的交易数量总是大于等于1,随后是这段时间内网络广播出来的Tx。
找到合适的Block是一件非常困难的事情,需要通过大量的数学计算才能发现,该计算过程称为“挖矿”。首个发现者,会得到一些比特币作为奖励。
数据链
多个Block连接起来成为数据链(Block Chain)。
为了引入容错与竞争机制,比特币系统允许Block Chain出现分叉,但每个节点总是倾向于选择最高的、难度最大的链,并称之为Best Chain,节点只认可Best Chain上的数据。
首个Block称为Genesis Block,并设定高度为零,后续每新增一个Block,高度则递增一。目前是不允许花费Genesis Block中的比特币的。
每个Block中的Tx在此Block中均唯一
一个Tx通常只会在一个Block里,也可能会出现在多个Block中,但只会在Best Chain中的某一个Block出现一次
货币存储
比特币是密码货币、纯数字化货币,没有看得见摸得着的硬币或纸币。一个人持有比特币意味着:
其拥有一些地址的私钥
这些地址是数笔交易的输出,且未花费
所有货币记录均以交易形式存储在整个blockchain数据块中,无交易无货币。货币不会凭空产生,也不会凭空消失。遗失了某个地址的私钥,意味着该地址上的Tx无法签署,无法成为下一个Tx的输入,便认为该笔比特币永久消失了。
货币发行
既然所有交易的输入源头都是来自CoinBase,产生CoinBase时即意味着货币发行。比特币采用衰减发行,每四年产量减半,第一个四年每个block的coinbase奖励50BTC,随后是25btc, 12.5btc, 并最终于2140年为零,此时总量达到极限为2100万个btc。
减半周期,严格来说,并不是准确的四年,而是每生成210000个block。之所以俗称四年减半,是因为比特币系统会根据全网算力的大小自动调整难度系统,使得大约每两周产生2016个block,那么四年约21万块block。
该函数GetBlockValue()用于计算挖得Block的奖励值:
int64 static GetBlockValue(int nHeight, int64 nFees)
{
int64 nSubsidy = 50 * COIN;
// Subsidy is cut in half every 210000 blocks, which will occur approximately every 4 years
nSubsidy = (nHeight / 210000);
return nSubsidy + nFees;
}123456789
当达到2100万btc以后,不再有来自CoinBase的奖励了,矿工的收入来源仅剩下交易的矿工费。此时,每个block的收入绝对值btc很低,但此时比特币应当会非常繁荣,币值也会相当的高,使得矿工们依然有利可图。
杜绝多重支付
传统货币存在多重支付(Double Spending)问题,典型的比如非数字时代的支票诈骗、数字时代的信用卡诈骗等。在比特币系统里,每笔交易的确认均需要得到全网广播,并收录进Block后才能得到真正确认。每笔钱的花销,均需要检测上次输入交易的状态。数据是带时间戳的、公开的,BlockChain由巨大的算力保障其安全性。所以比特币系统将货币的多重支付的风险极大降低,几近于零。通过等待多个Block确认,更是从概率上降低至零。一般得到6个确认后,可认为非常安全。但对于能影响你人生的重大支付,建议等待20~30个确认。
匿名性
任何人均可以轻易生成大量的私钥、公钥、地址。地址本身是匿名的,通过多个地址交易可进一步提高匿名性。但该匿名性并不像媒体宣传的那样,是某种程度上的匿名。因为比特币的交易数据是公开的,所以任何一笔资金的流向均是可以追踪的。
不了解比特币的人为它的匿名性产生一些担忧,比如担心更利于从事非法业务;了解比特币的人却因为它的伪匿名性而苦恼。传统货币在消费中也是匿名的,且是法律保障的,大部分国家都不允许个人涂画纸币。
地址本身是匿名的,但你可以通过地址对应的私钥签名消息来向公众证明你拥有某个比特币地址。
其他名词
哈希
哈希(Hash)是一种函数,将一个数映射到另一个集合当中。不同的哈希函数映射的空间不同,反映到计算机上就是生成的值长度不一样。同一个哈希函数,相同的输入必然是相同的输出,但同一个输出却可能有不同的输入,这种情况称为哈希碰撞。
常见的哈希函数有CRC32, MD5, SHA1, SHA-256, SHA-512, RIPEMD-160等,哈希函数在计算中有着非常广泛的用途。比特币里主要采用的是SHA-256和RIPEMD-160。
脑钱包纸钱包
前面提到过的脑钱包与纸钱包,这其实不算是钱包的分类,只是生成、存储密钥的方式而已。脑钱包属于迷你私钥的产物。脑钱包就是记在脑袋里的密钥,纸钱包就是打印到纸上的密钥,仅此而已。
有同学提到过,以一个计算机文件作为输入,例如一个数MB大小的照片,通过某种Hash运算后得到私钥的方法。这个方案的安全性还是不错的,同时可以防止盗私钥木马根据特征扫描私钥。文本形式存储私钥是有特征的,而一个照片文件却难以察觉,即使放在云盘等第三方存储空间中都是安全的。
Ⅳ 概括《比特币:一种点对点的电子现金系统》论文的要点
概括比特币一种点对点的电子现金系统论文的要提示什么了?这个论文要提,你要去官方网搜索就得到答案了。
Ⅳ 谁知道比特币是什么它是怎么运作的
比特币是一种P2P形式的虚拟的加密数字货币。点对点的传输意味着一个去中心化的支付系统。与所有的货币不同,比特币不依靠特定货币机构发行,它依据特定算法,通过大量的计算产生。
比特币及其众多衍生品被称为加密货币。 该系统使用了加密技术来生成新币,以及进行转帐验证。 加密序列有以下几个目的:使交易几乎不可能被伪造;使货币银行或货币钱包可作为数据轻松转移;验证比特币从一个用户转移到另一个用户。
在比特币被使用之前,必须先由系统生成或挖矿得到新币。 这些区块的编码和解码过程需要大量的算力,那些成功生成新区块的用户将获得一些比特币或一部分交易费用作为奖励。
这样一来,将比特币从一位用户转移到另一位用户的同样过程中,在同等基础上也为贡献给比特币网路的更多算力创造了需求,从而生成出可供使用的新币。
(5)比特币中的rpc服务扩展阅读:
比特币的作用
比特币就像现实中的金币一样:它们具有价值,也可以像金币一样用于交易。 可以透过比特币进行投资——买入加密货币并从其价格波动中获利。 每天都有新的地方将比特币列入支付方式。
比特币没有一个正式价格。 比特币的价格是根据人们愿意支付的价格来确定的。比特币的价格通常以一枚比特币的花费来表示。 但是,交易所一般会允许以任何金额购买,即可以购买少于一枚比特币。 Libertex 的价格指数就是即时查看比特币价格的优质资源。
参考资料来源:网络-比特币
Ⅵ 比特币矿池的协议stratum
转自: https://zhuanlan.hu.com/p/23558268
getblocktemplate协议诞生于2012年中叶,此时矿池已经出现。矿池采用getblocktemplate协议与节点客户端交互,采用stratum协议与矿工交互,这是最典型的矿池搭建模式。
与getwork相比,getblocktemplate协议最大的不同点是:getblocktemplate协议让矿工自行构造区块。如此一来,节点和挖矿完全分离。对于getwork来说,区块链是黑暗的,getwork对区块链一无所知,他只知道修改data字段的4个字节。对于getblocktemplate来说,整个区块链是透明的,getblocktemplate掌握区块链上与挖矿有关的所有信息,包括待确认交易池,getblocktemplate可以自己选择包含进区块的交易。
挖矿有两种方式,一种叫SOLO挖矿,另一种是去矿池挖矿。前文所述的在节点客户端直接启动CPU挖矿,以及依靠getwork+cgminer驱动显卡直接连接节点客户端挖矿,都是SOLO挖矿,SOLO好比自己独资买彩票,不轻易中奖,中奖则收益全部归自己所有。去矿池挖矿好比合买彩票,大家一起出钱,能买一堆彩票,中奖后按出资比率分配收益。理论上,矿机可以借助getblocktemplate协议链接节点客户端SOLO挖矿,但其实早已没有矿工会那么做,在写这篇文章时,比特币全网算力1600P+,而当前最先进的矿机算力10T左右,如此算来,单台矿机SOLO挖到一个块的概率不到16万分之一,矿工(人)投入真金白银购买矿机、交付电费,不会做风险那么高的投资,显然投入矿池抱团挖矿以降低风险,获得稳定收益更加适合。因此矿池的出现是必然,也不可消除,无论是否破坏系统的去中心化原则。
矿池的核心工作是给矿工分配任务,统计工作量并分发收益。矿池将区块难度分成很多难度更小的任务下发给矿工计算,矿工完成一个任务后将工作量提交给矿池,叫提交一个share。假如全网区块难度要求Hash运算结果的前70个比特位都是0,那么矿池给矿工分配的任务可能只要求前30位是0(根据矿工算力调节),矿工完成指定难度任务后上交share,矿池再检测在满足前30位为0的基础上,看看是否碰巧前70位都是0。
矿池会根据每个矿工的算力情况分配不同难度的任务,矿池是如何判断矿工算力大小以分配合适的任务难度呢?调节思路和比特币区块难度一样,矿池需要借助矿工的share率,矿池希望给每个矿工分配的任务都足够让矿工运算一定时间,比如说1秒,如果矿工在一秒之内完成了几次任务,说明矿池当前给到的难度低了,需要调高,反之。如此下来,经过一段时间调节,矿池能给矿工分配合理难度,并计算出矿工的算力。
矿池通过getblocktemplate协议与网络节点交互,以获得区块链的最新信息,通过stratum协议与矿工交互。此外,为了让之前用getwork协议挖矿的软件也可以连接到矿池挖矿,矿池一般也支持getwork协议,通过阶层挖矿代理机制实现(Stratum mining proxy)。须知在矿池刚出现时,显卡挖矿还是主力,getwork用起来非常方便,另外早期的FPGA矿机有些是用getwork实现的,stratum与矿池采用TCP方式通信,数据使用JSON封装格式。
先来说一下getblocktemplate遗留下来的几个问题:
矿工驱动:在getblocktemplate协议里,依然是由矿工主动通过HTTP方式调用RPC接口向节点申请挖矿数据,这就意味着,网络最新区块的变动无法及时告知矿工,造成算力损失。
数据负载:如上所述,如今正常的一次getblocktemplate调用节点都会反馈回1.5M左右的数据,其中主要数据是交易列表,矿工与矿池需频繁交互数据,显然不能每次分配工作都要给矿工附带那么多信息。再者巨大的内存需求将大大影响矿机性能,增加成本。
Stratum协议彻底解决了以上问题。
Stratum协议采用主动分配任务的方式,也就是说,矿池任何时候都可以给矿工指派新任务,对于矿工来说,如果收到矿池指派的新任务,应立即无条件转向新任务;矿工也可以主动跟矿池申请新任务。
现在最核心的问题是如何让矿工获得更大的搜索空间,如果参照getwork协议,仅仅给矿工可以改变nNonce和nTime字段,则交互的数据量很少,但这点搜索空间肯定是不够的。想增加搜索空间,只能在hashMerkleroot下功夫,如果让矿工自己构造coinbase,那么搜索空间的问题将迎刃而解,但代价是必要要把区块包含的所有交易都交给矿工,矿工才能构造交易列表的Merkleroot,这对于矿工来说压力更大,对于矿池带宽要求也更高。
Stratum协议巧妙解决了这个问题,成功实现既可以给矿工增加足够的搜索空间,又只需要交互很少的数据量,这也是Stratum协议最具创新的地方。
再来回顾一下区块头的6个字段80字节,这个很关键,nVersion,nBits,hashPrevBlock这3个字段是固定的,nNonce,nTime这两个字段是矿工现在就可以改变的。增加搜索空间只能从hashMerkleroot下手,这个绕不过去。Stratum协议让矿工自己构造coinbase交易,coinbase的scriptSig字段有很多字节可以让矿工自由填充,而coinbase的改动意味着hashMerkleroot的改变。从coinbase构造hashMerkleroot无需全部交易,
如上图所示,假如区块将包含13笔交易,矿池先对这13笔交易进行处理,最后只要把图中的4个黑点(Hash值)交付给矿工,同时将构造coinbase需要的信息交付给矿工,矿工就可以自己构造hashMerkleroot(图中的绿点都是矿工自行计算获得,两两合并Hash时,规定下一个黑点代表的hash值总是放在右边)
。按照这种方式,假如区块包含N笔交易,矿池可以浓缩成log2(N)个hash值交付给矿工,这大大降低了矿池和矿工交互的数据量。
Stratum协议严格规定了矿工和矿池交互的接口数据结构和交互逻辑,具体如下:
1. 矿工订阅任务
启动挖矿机器,使用mining.subscribe方法链接矿池
返回数据很重要,矿工需本地记录,在整个挖矿过程中都用到,其中:
Extranonce1,和 Extranonce2对于挖矿很重要,增加的搜索空间就在这里,现在,我们至少有了8个字节的搜索空间,即nNonce的4个字节,以及 Extranonce2的4个字节。
2. 矿池授权
在矿池注册一个账号 ,添加矿工,矿池允许每个账号任意添加矿工数,并取不同名字以区分。矿工使用mining.authorize方法申请授权,只有被矿池授权的矿工才能收到矿池指派任务。
3. 矿池分配任务
以上每个字段信息都是必不可少,其中:
有了以上信息,再加上之前拿到的Extranonce1 和Extranonce2_size,就可以挖矿了。
4. 挖矿
1) 构造coinbase交易
用到的信息包括Coinb1, Extranonce1, Extranonce2_size 以及Coinb2,构造很简单:
为啥可以这样,因为矿池帮矿工做了很多工作,矿池已经构建了coinbase交易,系列化后在指定位置分割成coinb1和coinb2,coinb1和coinb2包含指定信息,比如coinb1包含区块高度,coinb2包含了矿工的收益地址和收益额等信息,但是这些信息对于矿工来说无关紧要,矿工挖矿的地方只是Extranonce2 的4个字节。另外Extranonce1是矿池写入区块的指定信息,一般来说,每个矿池会写入自己矿池的信息,比如矿池名字或者域名,我们就是根据这个信息统计每个矿池在全网的算力比重。
2) 构建Merkleroot
利用coinbase和merkle_branch,按照上图方式构造hashMerkleroot字段。
3) 构建区块头
填充余下的5个字段,现在,矿池可以在nNonce和Extranonce2 里搜索进行挖矿,如果嫌搜索空间还不够,只要增加Extranonce2_size为多几个字节就可轻而易举解决。
5. 矿工提交工作量
当矿工找到一个符合难度的shares时,提交给矿池,提交的信息量很少,都是必不可少的字段:
矿池拿到以上5个字段后,首先根据任务号ID找出之前分配任务前存储的信息(主要是构建的coinbase交易以及包含的交易列表等),然后重构区块,再验证shares难度,对于符合难度要求的shares,再检测是否符合全网难度。
6. 矿池给矿工调节难度
矿池记录每个矿工的难度,并根据shares率不断调节以指定合适难度。矿池可以随时通过mining.set_difficulty方法给矿工发消息另其改变难度。
如上,Stratum协议核心理念基本解析清楚,在getblocktemplate协议和Stratum协议的配合下,矿池终于可以大声的对矿工说,让算力来的更猛烈些吧。
Ⅶ 比特币的运行包括时间服务器任何服务器吗
比特币的运行时间同步是需要时间服务器的。
比特币是分布式的,没有中心服务器。当然最开始还是要有个通道完成网络初始化的。
比特币的运作:交易发生后,将广播全网。很短的时间内,全网所有的节点会接到这笔交易。接到这笔交易后,每个节点会先把交易放入内存,然后对交易进行合法性检验,检验通过后,这笔交易进入有效交易池,等待被装入区块。
比特币:
比特币的概念最初由中本聪在2008年11月1日提出,并于2009年1月3日正式诞生。
根据中本聪的思路设计发布的开源软件以及建构其上的P2P网络。比特币是一种P2P形式的数字货币。比特币的交易记录公开透明。点对点的传输意味着一个去中心化的支付系统。
与大多数货币不同,比特币不依靠特定货币机构发行,它依据特定算法,通过大量的计算产生,比特币经济使用整个P2P网络中众多节点构成的分布式数据库来确认并记录所有的交易行为,并使用密码学的设计来确保货币流通各个环节安全性。
P2P的去中心化特性与算法本身可以确保无法通过大量制造比特币来人为操控币值。基于密码学的设计可以使比特币只能被真实的拥有者转移或支付。
这同样确保了货币所有权与流通交易的匿名性。比特币其总数量非常有限,具有稀缺性。该货币系统曾在4年内只有不超过1050万个,之后的总数量将被永久限制在2100万个。
2021年6月,萨尔瓦多通过了比特币在该国成为法定货币的《萨尔瓦多比特币法》法案。[43]9月7日,比特币正式成为了萨尔瓦多的法定货币,成为世界上第一个赋予数字货币法定地位的国家。
Ⅷ 求教,比特币钱包怎么与php建立连接
就目前来说如果有开发文档你需要根据开发文档来弄,如果不是那就没有办法了。
希望我的回答可以帮到你,如果有什么不懂可以追问。
Ⅸ bitcoin: coinbase的tx结构
查找下 block 400000 的coinbase的交易.
第一个 Transactions 就是 coinbase .
使用rpc命令 getrawtransaction 得到 rawtransaction .
在使用 decoderawtransaction 解析 上一步得到的 rawtransaction ,即 794d88ac00000000
结果如下:
coinbase tx手动分析下
tx结构不一样 https://btc.com/
bip143
参考:
sipa的回答 https://bitcoin.stackexchange.com/a/20725
https://en.bitcoin.it/wiki/Transaction
https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer
https://bitcoin.stackexchange.com/a/5241