{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2019-12-19 11:09:39","updateBy":"admin","updateTime":"2019-12-19 11:09:39","remark":null,"id":7,"articleTitle":"比特币——点对点电子现金系统","articleUrl":"bitcoin","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220906/ead03235c356458c9e3fa664b3f5837f.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"0","articleSummary":"2008年爆发全球金融危机，2008年11月1日，一个自称中本聪（Satoshi Nakamoto）的人在P2P foundation网站上发布了比特币白皮书《比特币：一种点对点的电子现金系统》 ，陈述了他对电子货币的新设想——比特币就此面世。2009年1月3日，比特币创世区块诞生。","articleContent":"### 1.比特币介绍\n\n2008年爆发全球金融危机，2008年11月1日，一个自称中本聪（Satoshi Nakamoto）的人在P2P foundation网站上发布了比特币白皮书《比特币：一种点对点的电子现金系统》  ，陈述了他对电子货币的新设想——比特币就此面世。2009年1月3日，比特币创世区块诞生。\n \n\n我们现如今使用的现金系统都是由银行来进行货币发行和交易记录，而比特币没有一个集中的发行方，而是由网络节点的计算生成，谁都有可能参与制造比特币，而且可以全世界流通，可以在任意一台接入互联网的电脑上买卖，不管身处何方，任何人都可以挖掘、购买、出售或收取比特币，并且在交易过程中外人无法辨认用户身份信息。2009年1月5日，不受央行和任何金融机构控制的比特币诞生。比特币是一种数字货币，由计算机生成的一串串复杂代码组成，新比特币通过预设的程序制造，随着比特币总量的增加，新币制造的速度减慢，直到2140年达到2100万个的总量上限。\n\n\n假如有A、B、C、D四个人在比特币交易平台上进行交易，A付给了B 10个比特币，那么他就要把这笔交易记录广播给其余三个人，其他三个人就在自己的账本上记录这一条消息。然后B又付给C 8个比特币，同时B也会将这条消息广播给另外的三个人，D的交易记录也同样如此。这些交易记录会记录在一个块里——区块，每个区块会存储4000条左右交易记录。这个块打包后把这个块连接到以前的块上，这条链就叫做区块链。打包这个块就叫做挖矿。但这个系统需要解决下列几个问题：\n\n1）交易记录以谁的账本为准。比如由于网络延时问题C会先收到B支付C的交易信息，后收到A支付B的交易信息，而D恰好相反，那么就需要一个账本作为基准。\n\n2）为什么要记账。我们每个人的硬盘资源是有限的，我们为什么要花费资源去记录别人的交易记录呢。\n\n3）如何防伪。比如A公布了“A支付给B 10比特币”这条记录，但实际上并没有付给B 10个比特币，那么这条记录就是伪造的。\n\n \n### 2.为什么记账\n\n记账会有奖励。一个是手续费的奖励：每个用户都可以记账，那么这条记录的发起人就要支付一部分手续费作为记账的奖励；另一个是打包的奖励：打包成功就会得到系统给的比特币奖励。中本聪设计比特币系统时设置了一条规则：每十分钟打一个包，并且在最初的四年中，打包成功后会获得50个比特币的奖励，四年后奖励变为25，再过四年就变为12.5个。所以比特币总量就为2100万个。有了这两个奖励后人们就会去打包这些交易记录，那么都去打包，应该以谁的为准呢？\n\n### 3.账本标准——工作量证明\n\n挖矿就是做数学题，去求解一个特定的数，谁求出这个数，谁才能去打包，也就是获得挖矿奖励。这道数学题没有任何一个人可以用脑子算出来，只能依靠计算机。\n\n哈希函数也叫数字摘要或散列函数，它的意思是可以把字符串经过运算转换为摘要的形式，这个算法正算很容易、反推很难。而哈希算法中有一种算法叫SHA256算法，是美国国家安全局发明的一种算法：如果把一个字符串输入这个算法，就会输出一个256位的二进制数。挖矿就是利用这个算法进行两次SHA256运算，也就是SHA256(SHA256(字符串))。\n\n挖矿的输入值应该由那些部分组成呢？前块的头部+账单的信息+时间戳+个人签名等+随机数，把这些输入算法中，输出结果为一个前n为是零的256位二进制数。假设n为30，为满足这个条件需要的随机数就是这个块的解，求出这个随机数后，将输出的哈希值（256位二进制数）作为新块的头部一起打包连接到链上，也就是挖矿成功，获得奖励。因为每个人所记录的交易信息不同，时间戳、签名等都不同，计算随机数的难度也会不同，但基本上算力更强的计算机更容易挖到矿。n的位数越多，计算越困难，为了满足设计初期每十分钟打包一次的速度，需要根据全球挖矿的计算机的算力进行n的调整。比如全球有10000台进行挖矿的计算机每台计算机每秒可进行14T（1.4*10^13）次哈希运算，十分钟可进行8*10^19次运算约为2^66次运算也就是说算出前66位都是0的概率接近1，在这种情况下就会设置前66位为0的规则。第一个算出前66位为0的人就可以打包这个块，并以他所记的账单为标准。\n\n### 4.如何防止伪造交易记录\n\n我们必须保证每条交易记录都是由比特币持有者发出，而非其他人伪造。这就需每个用户都有一个电子签名。用户在注册时系统会为用户生成一个随机数，通过这个随机数产生一个叫私钥的字符串，私钥又可以产生公钥，以及一个地址。私钥由用户保存，公钥和地址他人可见，私钥用来对字符串进行加密，公钥可以用来对加密后的密文进行解密，比如A发出了一条“A付给B 10个比特币”的交易记录，那么他会把这条消息进行哈希运算得到一个摘要，再把这个摘要用私钥进行加密，之后把公钥、“A付给B 10个比特币”的交易记录连同加密后的密文一同广播出去。收到消息的人会去验证这条消息的真伪，他们把交易记录进行哈希运算得到摘要一，把密文和公钥进行解密得到摘要二，如果摘要一和摘要二相同那么就说明这条信息确实是A发出的，这个过程就叫做电子签名。\n\n我们如何保证不会出现余额不足、双重支付？比如A发出“A付给B 10个比特币”的交易记录，但A并没有这么多比特币，或者A只有10个比特币，但却同时支付B和C 10个比特币。这就需要余额检查：如果在当前所有交易记录中计算出的A的余额大于10个比特币，那么A发出的“A付给B 10个比特币”这条交易记录就会被人们接受，如果不满足条件，这条消息就不会被接受，一直到这条记录被打包到一个区块里就会被系统接受。就解决了余额不足的问题，那么如何解决双重支付的问题呢？A只有10个比特币，但同时发出了两条消息“A付给B 10个比特币”、“A付给C 10个比特币”，用户们收到消息后就回去验证余额，如果接受了第一条消息后就会拒绝第二条消息。但有些用户可能先接收到了第二条消息，那么就会拒绝第一条消息。虽然用户接受到了消息，但此时交易并不会被确认，知道这条消息被打包进一个块里。当这个块被确认后，其他用户就会放弃自己记录的消息，然后从新产生的链后进行打包，假如这个块里记录的是“A付给B 10个比特币”这条消息，那么“A付给C 10个比特币”这条记录就会被放弃。所以我们收到别人的付款时不能立即认为钱已经到账，应该等块形成后才能确认。\n\n第三个问题，应该如何防止篡改交易记录呢？我们不可能去伪造别人的电子签名，但可以伪造消息记录，比如A付给了B 10个比特币，但他想删掉这条记录，应该怎么防止呢？比特币的另一个原则——最长链原则：区块链总以最长的分支作为标准。比如有两个矿工同时打包了一个新块，那么可能会有两批人收到不同的新链（1和2），那么不管他们知不知道另一个分支的存在，他们都会各自在自己收到的链后进行打包，直到有一个人又打包出一个新块并把这条链（比如1链）广播出去，那么全网就会接受更长的分支并把它作为主链继续打包。假如有一个人认准2链并在其后进行挖矿、打包，那么他就需要算的比其他所有人都要快，才能使2链变为最长链，才能使人们接受这条链。除非你有全世界矿机50%以上的算力才有可能去篡改交易记录。","categoryId":8,"viewCount":1047,"categoryName":"随笔","author":"球接子","authorAvatar":null,"tagIds":[12],"tagNames":["突发奇想"]}}