美文网首页
【白皮书系列】比特币白皮书(三)

【白皮书系列】比特币白皮书(三)

作者: 9abda844c1aa | 来源:发表于2018-07-07 23:04 被阅读0次

[3. 时间戳服务器]

The solution we propose begins with a timestamp server.

[译] 我们提出的解决方案是先提出一个“时间戳服务器”

[注] 时间戳服务器是用来解决前面提到的双重支付问题的。

A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post

[译] 时间戳服务器通过对对区块内容进行哈希而加上时间戳,并将该哈希值进行广播,像是在新闻或世界性新闻组网络发文章。

[注] 哈希计算:不论哈希前的字节长度,哈希之后得到的字符长度是一样的。如HASH256,哈希之后会产生256 bit的字符,并且哈希前的字符串修改哪怕是一个比特,也会产生不同的哈希值。

如bitcoin字符使用HASH256之后是:

6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107b

那么我把bitcoin改为bjtcoin,使用HASH256之后是:

2d119f3e6dec8efae37d6b8e37ac79948ab3bf7e6783361c8e2f4900c8169f2a

并且通过哈希之后的值反推出哈希之前的值很很难的。这种计算是单向的,即很难反向计算得到哈希计算的值。如求解一个一元二次方程稍微复杂(虽然有现有的公式),但是验证这个解是否正确则非常简单(直接代入计算)。因此,这里也同样,计算得到哈希值简单(有专门的API函数),但是反向求导,则异常困难。

image

[注] 新块的时间戳是由这个块的内容(主要是交易记录)和之前一个块的时间戳(哈希后的哈希值)共同哈希得到。即时间戳是一个数组的哈希值。前面一个块的内容会影响到后一个块的时间戳(哈希值),因此每个块的内容都与后面的时间戳有关。前面提到,如果哈希之前的原始数据中即使其中的一个比特被修改,则最后的哈希值也会改变。因此,如果中间区块的内容被修改,则最后的时间戳也会更改,这时候就会与大多数其他的节点的时间戳不一致。这样就很容易验证出来。

[问题] 这里说的时间戳与实践有没有关联?从上面的描述看,似乎只是交易数据的哈希。将区块串起来形成区块链前面的区块自然就会在前面。时间上更靠前。可是如果没有时间的概念,如何应对双重支付呢?

如果我先支付一笔比特币转账给A,但是我提供很少的矿工费,从而形成打包成区块的时间会更久。在另外一个地方(考虑到交易会广播出去,我在一个没有接收到我的上一笔交易的节点附近)再用这笔比特币转账给B,这时我提供矿工费多一些,保证能够在转账给A的交易打包之前打包形成区块。这样由于没有时间的概念,从而实现双重支付。

现实中肯定有这种想法的人,如果有这种简单的漏洞,肯定比特币会发现。所以,我认为时间戳还是有一个时间的概念。肯定也有相应的机制来解决上面的问题。是我现在还没有理解到。

看了简书上其他的大神的内容,也基本上有提到时间戳上有使用到时间的,也有说直接是使用哈希然后广播的。我也糊涂了,索性看了下代码简单理一下:

unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock)
{
unsigned int nProofOfWorkLimit = Params().ProofOfWorkLimit().GetCompact();

// Genesis block
if (pindexLast == NULL)
    return nProofOfWorkLimit;

// Only change once per interval
if ((pindexLast->nHeight+1) % nInterval != 0)
{
    if (TestNet())
    {
        // Special difficulty rule for testnet:
        // If the new block's timestamp is more than 2* 10 minutes
        // then allow mining of a min-difficulty block.
        if (pblock->nTime > pindexLast->nTime + nTargetSpacing*2)
            return nProofOfWorkLimit;
        else
        {
            // Return the last non-special-min-difficulty-rules-block
            const CBlockIndex* pindex = pindexLast;
            while (pindex->pprev && pindex->nHeight % nInterval != 0 && pindex->nBits == nProofOfWorkLimit)
                pindex = pindex->pprev;
            return pindex->nBits;
        }
    }
    return pindexLast->nBits;
}

注意到这里有个注释:

// If the new block's timestamp is more than 2* 10 minutes
        if (pblock->nTime > pindexLast->nTime + nTargetSpacing*2)

那么久认为这里的pblock->nTime是块的时间戳。那么其是传入的参数const CBlockHeader *pblock,那么其结构就是CBlockHeader,对该结构进行查看:

class CBlockHeader
{
public:
    // header
    int32_t nVersion;
    uint256 hashPrevBlock;
    uint256 hashMerkleRoot;
    uint32_t nTime;
    uint32_t nBits;
    uint32_t nNonce;

其uint32_t nTime;认为是时间戳,那么这里显然是要记录时间的。

顺便再贴一下简书大神关于时间的理解:时间来自于连接的其他节点(node)时间的中位数(mean,是个数学概念,比平均值更不受极端数字影响),要求连接的节点(node)数量至少为5,中位数和本地系统时间差别不超过70分钟,否则会提醒你更新本机的时间。同时,在接收到新的block时会拒绝时间与自己差距+2小时和-(前11个block时间中位数)的block

上述的理解也不确定是否正确,先记录下来,以后深入理解了再来填坑吧。

相关文章

  • 比特币白皮书精读笔记—时间戳篇

    本文为精读比特币白皮书系列课程笔记,文中摘录了比特币白皮书原文,并对原文进行翻译,说明和讲解。 比特币白皮书摘要篇...

  • 关于区块链的收藏文章

    精读比特币白皮书1 精读比特币白皮书2:中本聪确实聪明 精读比特币白皮书3:最宝贵的果然是时间 精读比特币白皮书4...

  • 比特币白皮书精读笔记—工作量证明篇

    本文为精读比特币白皮书系列课程笔记,文中摘录了比特币白皮书原文,并对原文进行翻译,说明和讲解。 To implem...

  • 比特币区块链 工具站点 汇总

    〇、白皮书 1.比特币白皮书 中文版2.比特币白皮书 英文版3.EOS白皮书 一、浏览器 1.比特币浏览器2.以太...

  • 比特币白皮书精读笔记—介绍篇

    本文为精读比特币白皮书系列课程笔记,文中摘录了比特币白皮书原文,并对原文进行翻译,说明和讲解。 传统信任体系的天然...

  • 比特币白皮书精读笔记—交易篇

    本文为精读比特币白皮书系列课程笔记,文中摘录了比特币白皮书原文,并对原文进行翻译,说明和讲解。 交易的本质就是转帐...

  • 区块链重要资料

    比特币 比特币官网比特币Wiki白皮书源代码 以太坊 以太坊爱好者以太坊Blog以太坊论坛以太坊Git白皮书

  • 比特币白皮书 学习(1):摘要篇

    比特币白皮书是一篇论文,是区块链技术的开山鼻祖。学习区块链,先从比特币白皮书开始,本周学习白皮书的摘要部分。 题目...

  • 比特币白皮书-双花

    0 比特币白皮书:《比特币-一种点对点的 电子现金系统》。区块链这个词就是在 比特币白皮书中诞生的。区块链其实没有...

  • 区块链资料

    群资料共享 比特币白皮书以太坊白皮书 区块链的使用和对国家的改造视频区块链的一个公司的应用的演讲视频 比特币白皮书...

网友评论

      本文标题:【白皮书系列】比特币白皮书(三)

      本文链接:https://www.haomeiwen.com/subject/lmdnuftx.html