六币之门 - 技术前沿
type: channel
link: http://www.06zg.com/category/forward/
items: 区块链来了，产品经理应该做些什么？
items: 区块链基础
items: 区块链基本原理及其技术实现 - 姜家志 | JTalk 第五期
items: （二）区块链的共识算法：PoS 及其 例子 代码 实现
items: 篡改 npm 包盗取比特币始末
items: 区块链记账原理 | 深入浅出区块链
items: 聊聊我眼中的 Web 3.0
items: 比特币源码研读(1)bitcoin源码结构
items: 【译】用JavaScript写一个区块链
items: 给Python初学者的最好练手项目

区块链来了，产品经理应该做些什么？
type: item
date: 2023-03-25T12:01:28+08:00
description: 前言：区块链可能是当今科技媒体最喜欢的话题之一，这很大程度上源于比特币在 2017 年的火爆。如果说 2017 年是比特币的一年，那 2018 很可能是区块链爆发的元年。作为产品经理，比起乱象丛生的币圈和需要技术背景的链圈，更关心的是区块链的实际应用场景。什么是区块链？假设现在 A 需要给 B 转一笔钱，他可以选择一些方式：银行卡划账、支付宝/微信转账等等。但这些方式都存在一个现有系统的问题：为了建立信任，我们需要一个第三方平台这样的系统可能存在一些问题，比如第三方系统不稳定、记录被恶意篡改……区块链技术的出现，给了这个问题一个很好的解决方案。区块链本质上是一种去中心化的分布式数据库，它不依赖于某一中心节点，所有参与到区块链网络中的服务器都参与维护，除非掌握 50% 以上的节点，否则很难被破坏，因此区块链具有高安全性。同时由于区块链为链状结构，新区块中的数据中包含上一区块的信息，这部分信息变得不可修改，因此区块链也具有信息不可篡改的特点。但为了控制区块的产生速度，新区块的计算变得非常困难，因此区块链会过渡消耗能源，这也就是为什么比特币的「矿工」们会使用特定的矿机，选择在低电价的地区进行「挖矿」。关于区块链更易懂和更详实的解释，可以看这篇文章 区块链入门教程，这里不再做过多的说明。区块链的应用目前区块链最广泛的应用就是以比特币为首的各种数字货币了。但除了这些纷乱复杂的数字货币外，作为产品经理，更应该着眼于区块链技术能给实际生活带来哪些改变。下面就介绍一些区块链的应用实例。1. 支付目前金融业可能是全球中心化程度最高的产业。毫无疑问，分散式货币的好处之一就是可以不需要银行这样的第三方中介机构，而直接进行转移支付，因此在跨境汇款过程中，区块链可以派上用场。现在，我们已经可以在几分钟之内使用区块链将资金转移到全球，而不是几天，同时由于其匿名性和数据不可篡改，使得这其中的资产交易更安全，因此区块链无疑提供了一个绝佳的解决方案。但由于在金融领域，目前关于区块链的使用标准和相关法律法规还不完善，制约了区块链在支付方面的应用。因此需要区块链技术提供企业、金融参与者、监管部门、立法机构通力合作，建立有效的合作机制。2.合同使用区块链技术，可以将传统合同转换为智能合同。与传统的合约不同，智能合同由软件代码组成，并由区块链网络执行。它的优势在于，合同一旦部署之后便不能被修改，这确保了双方的协议都可以不参与，在区块链上用代码编写的智能合约是一旦被触发就完全不可改变的合约。目前已有一些平台在使用区块链技术的智能合约，如 CoinFabrik，法大大等。3.公益还记得当时的郭美美事件带来的恶劣社会性影响吗，很大原因在于公益流程中的一些环节不透明，公益活动的参与者不能监控整个流程中的每一环节。使用区块链技术，可以将公益活动的项目、资金数量、资金流向等存放在区块链中，任何人都可以查看，使公益行为更透明，为社会所监督。4.食品作为一个具有食品科学背景的人，区块链如何在食品行业中使用也是我关心的问题。目前食品安全问题已经被越来越多的人所重视，但由于食品从原材料的获取，到生产加工、包装、分销，这其中每个环节都离普通消费者很远，我们无法追溯到食品的每一个环节。假设说生产者使用了劣质的食物原材料，或者是食品供应商篡改了食品保质期信息，这些食品安全的隐患，作为消费者是无法获知的。利用区块链技术，在食品供应链环节上进行系统追踪，从原料来源，到食品制作，再到批发商和零售商，每个流程都会记录下它的原始标志符，用户使用手机 App 识别之后便可以获取食品全流程的信息，而区块链的不可篡改保证了这些信息的真实性。目前 TD-FOOD 公司已经在越南站稳脚跟，推动从农场到餐桌食品追溯系统公开，旨在重构食品供应生态。5.文娱互联网技术的发展使得文娱产业从终端设备使用、内容分发到商业获利各个环节，发生了一系列的变革，但这其中仍有部分未能很好解决的问题，例如困扰电影、电子书和数字专辑很久的版权问题。通过区块链技术，可以在这其中的各个环节进行渗透，利用分布式账本的能力来解决这个问题。目前已有一家名为 Custos Media 的企业，通过难以察觉的水印技术和区块链技术，匿名转换盗版文件的下载者和上传者，来保护数字媒体文件面授在线盗版的侵害，一旦被侵权作品出现则会立即进行通知。再比如数字媒体的分发。我们都希望在 iTunes 上购买的歌曲，或者亚马逊上购买的电子书可以作用于所有的媒体上，但目前我们购买的更多相当于是一个对应平台上的副本，不具有在其他平台上使用的能力。一家名为 OPUS 的公司是世界上第一个基于 ETH（以太坊）和 IPFS（星际文件系统） 的去中心化音乐平台。它基于以太坊的逻辑层，处理 Opus 网络上的所有交易，使得用户无论在何处购买了音乐，都可以在任何播放器上进行播放，同时…

区块链基础
type: item
date: 2023-03-25T12:01:27+08:00
description: 原文链接：blog.yuccn.net

区块链基本原理及其技术实现 - 姜家志 | JTalk 第五期
type: item
date: 2023-03-25T12:01:26+08:00
description: 编者按：本文系比特大陆的姜家志讲师，在掘金技术社区主办的《给开发者的区块链技术指南 | JTalk 掘金线下活动第五期》 活动上的分享整理。掘金 JTalk 目前已举办5期，每期 JTalk 会邀请垂直行业的优秀工程师来分享优秀的实践经验，技巧方法。旨在为开发者提供线下技术交流互动机会，帮助开发者成长。姜家志，比特大陆哥白尼项目负责人；BCH 社区资深开发者；10年后端技术及互联开发经验，比太钱包Android 和 iOS 客户端的开发者; 从事区块链底层协议的研究，关注高性能、分布式系统的研发。区块链现在所有的项目都有一个很大的性能问题，需要从技术方面去克服，这是我们团队关注的一个方向，另外整个区块链产业发展很大一部分推动力是来自于密码学。 我们还有一个任务是把密码学上的一些思路和研究，在工程上进行实现。我是2013年开始接触比特币，最早接触比特币时，我接近两个星期每晚都处于睡不着觉的状态 。我本想着2015、2016年的时候比特币就应该能普及到很多人了，但经历了14、15年的熊市，觉得可能要再延后几年。出乎意料的是，2017年区块链大规模普及。今天跟大家分享一下区块链的基本原理及技术方面的实现。1. 区块链是什么？什么是区块链？给区块链一个完整定义是很难的，原因有如下两方面：现在区块链涉及的行业太多，很难给它一个很明确的定义。 区块链基本上每隔一段时间都会发生很大的改变，大家可以在上面作出更多有意思、好玩的东西。去中心化比特币最大的特点是去中心化。采用POW，比如早期的比特币、以太坊等都是使用POW，经过长达十年证明之后，POW在去中心化的实现上是最好的证明。现在出现POS、DPOS，都是在一定程度上牺牲了去中心化。DPOS采用选举制度，你所投票的人能代表你自己的想法，但并不意味着任何人能够随意的加入网络。去中心化有几个很鲜明的特点： 抗审查能力。 在整个网络活动中，对应到整个区块链里就是所发生的一笔交易，不会因为个人原因就会被拒绝，就是抗审查能力。整个网络里，即使一个矿池拒绝了你的交易，也会有其他矿池帮你打包。 当某一个网络挂了或某一些不可抗拒原因导致某个节点挂了，不会影响整个网络运转。POW、BCH、BTC、以太坊都具有这样的能力，任意一个矿池挂了，其他节点依然正常在运转，如果把所有矿池都挂了，在运行节点中的节点会重新搭建起一个全新的狂吃，这样有可能会出现整个网络处理能力的下降，但网络是不可摧毁的。DPOS这种方式肯定会牺牲以上说的两点特性，如果21节点全部被封禁了，恢复就有一定的困难性(备用节点的设计方案还有待确认)。21节点也同样的具有审查交易的能力，任何人想进入这个网络也很困难（需要通过选举）。我称这种方式为弱中心化，毕竟还是有21节点的，不是一个完全的中心化。弱中心化的设计是为了提高性能上一些指标，为了能做更多事情，牺牲了去中心化的特点。 数字化账本整个区块链都是运行在互联网上 不可更改这个特性在比特币里比较明显，在以太坊里，会出现能更改的可能性。如果一个合约在定义好之后，之后通过交易是可以改变它的状态。但这个可更改性也是之前定义好的，也就是说大家知道你的合约就是这样写的。 确定性的复制状态机简单来说就是整个网络所有节点能够拿到所有的数据。 可编程性在比特币中就有体现。在以太坊上，可编程性被进一步放大，他使用的语言是solidity,它是一种类似于JavaScript的语言。 匿名性因为每个地址/账户在整个网络里，不和真实世界中人物对应。但是因为比特币这种交易是链式的结构，如果你知道这个币给谁了，反向追踪是可以找到源头。匿名性是如果不带入真实世界里，不和真实身份的进行交易的话，是有一定的匿名性。反之，这种匿名性就会消失。这也是为什么交易所会强制做KYC严格身份认证的原因。 区块链工作原理公私钥体系 数字签名认可 全网广播 区块记录交易以交易为单位，每个交易会记录在区块链上，不会记录真实结果，这些交易本身会影响结果。 链式结构整个交易、区块都是链式结构，大家一直会往一个方向不断延伸下去，不会出现回路或分叉。 参与者确认有效性在比特币中是矿工确认交易，在EOS中是由超级节点确认交易。 区块链特征区块链是资产型网络。无论现在看到什么样的区块链项目，都运行着一个资产网络。强规则网络有如加密、签名、验证、交易和确认等操作。任何一块不符合规则的话，整个块就会被拒绝。在互联网项目中，出现不一致的情况时，后续是有修复和解决的机会；但是在区块链里，这种可能性非常低。如果出现一个很小Bug，整个网络运行都会出现问题，会对整个网络影响很大。在早期，比特币出现过几次的Bug造成了分叉，全网暂停后重新运行。但现在如果再出现类似Bug，就很严重了，因为当时比特币网络参与人员少，比特币价格低，造成的影响较小。 弱信任每个节点都有对等的，把整…

（二）区块链的共识算法：PoS 及其 例子 代码 实现
type: item
date: 2023-03-25T12:01:24+08:00
description: 作者：林冠宏 / 指尖下的幽灵掘金：juejin.cn/user/178526…博客：www.cnblogs.com/linguanh/GitHub ： github.com/af913337456…腾讯云专栏： cloud.tencent.com/developer/u…BTW：本人技术书籍《区块链以太坊DApp开发实战》现已出版并可网购了，适合初中级区块链技术相关研发人员阅读。目录前序 PoS 共识算法 PoS 的特点 编写 PoS 代码 候选块数组 块中的节点地址 进行股权分配 根据股权选出赢家 结束 前序这篇文章是上一篇的序章，上一篇的链接地址是：juejin.cn/post/684490…（一）区块链的共识算法：整体介绍 及 分叉 的通俗讲解本篇文章将会着重介绍 PoS 共识算法和采用代码例子来实在地阐述它关于什么是共识算法这个问题，请查看（一）区块链的共识算法：整体介绍 及 分叉 的通俗讲解 ，里面已经给出了答案。PoS 共识算法PoS 全称为 Proof of Stake 股权证明。字面意思就是，股份制。就是说，谁的股份越多，谁的话事权越大，这和我们生活中的股份制公司中的股东的意思的差不多的。但是，在区块链的应用中，我们并不可能真实地分配给链中的节点股份，取而代之的是另外一些东西，这些东西充当股份，我们将这些东西分配给链中节点。下面将举一些例子来加以阐述这个概念。例如 PoS 在虚拟货币的应用中，我们可以把持币量的多少，来看作拥有股权、股份的多少，假设某条公链以拥有的 XXX 代币的数量来衡量，这个节点的股份有多少，它的话事权有多少。假设一个公链网络中，共有3个节点，A 和 B 和 C，其中 A 节点拥有10000 个 XXX 代币，而 B 和 C 分别有 1000 和 2000 个，那么在这个以太坊网络中，A 的区块是最有可能被选中的，话事权是比较大的。再例如，假设日后的某个非虚拟货币的区块链、公有链，一条实体业结合的链，例如 汽车链，我们就可以把每一位车主所拥有的车辆数目和他的车价值多少钱来分配股份，例如规定一条公式：车数*车价值 = 股份的多少，在 PoS 中股份是一个概念，一个衡量话事权的概念。PoS 的特点上面的描述已经说明了 PoS 共识算法的概念。因为它是以拥有某样东西的数量来衡量话事权的，这就意味着，只要我们的节点，拥有这类东西，哪怕拥有的只有 一个，都是有话事权的，即使很小，甚至都没机会露面，但它还是有机会。在 PoS 中，块是已经铸造好的(这里没有“挖矿”的概念，所以我们不用这个词来证明股份)，PoW 是有挖矿概念的。这也就造成了它有下面的特点：优点： 缩短了共识达成的时间，链中共识块的速度更快 不再需要大量消耗能源挖矿 作弊得不尝失，因为如果一名持有 51% 以上股权的人作弊，相当于他坑了自己，因为他是拥有股权最多的人，作弊导致的结果往往是拥有着越多的损失越多 缺点： 攻击成本低，只有节点有物品数量，例如代币数量，就能发起脏数据的区块攻击 另外拥有代币数量大的节点获得记账权的概率会更大，会使得网络共识受少数富裕账户支配，从而失去公正性 编写 PoS 代码为了能让更多人，以及非 go 开发者能看懂，下面将通过 伪代码 来实现，完整的 go 代码请留邮箱。首先我们使用一个候选区块数组来保存，每一个 节点 广播过来的和自己当前节点生成的区块对象： candidateBlocks [ ]Blocks 候选区块数组 复制代码每个区块结构体里面有一个变量 是用来记录生成这个区块的节点地址的type Block struct { Timestamp string // 时间戳，代表该区块的生成时间 Hash string // 这个区块的 hash 值 PrevHash string // 这个区块的 上一个 区块的 hash 值 NodeAddress string // 生成这个区块的 节点地址 Data string // 区块携带的数据 } 复制代码然后有一个 子线程，专门负责遍历 候选区块数组，来根据区块里面的节点地址 获取 它的代币数量，然后分配股权 stakeRecord []string // 数组 for block ~ candidateBlocks { coinNum = getCoinBalance(block.NodeAddress) // 获取代币数量 for i ~ coinNum { // 币有多少，就循环添加多少次 if stakeRecord.contains(block.NodeAddress) { // 是否以及包含了 break // 包含的就不再重复添加 } stakeRecord = append(block.NodeAddress) // 添加 } } 复制…

篡改 npm 包盗取比特币始末
type: item
date: 2023-03-25T12:01:23+08:00
description: @蒋欢，美团点评前端工程师，3年工作经验，主要负责美团点评“云店助手"客户端和"美团点评智慧餐厅"小程序的开发。本文首发于 蒋欢的知乎专栏 ，敬请关注。正文从这开始～比特币钱包 Copay 被依赖链攻击这个瓜上周在技术圈里被广泛讨论，我在看了众多大神分析之后理清了前因后果。在这里也给大家来分享一波黑客是如何一步步实施他的惊人计划的。一、 背景介绍event-stream 是开源社区里一个用于处理 Node.js 流数据的 npm 包，它使得创建和使用流变得容易，正是因此，受到了广大开发者的欢迎，目前这个库上周下载量达到了165万。event-stream在npm的托管而这起事件起因是由于该项目的作者 @dominictarr 受限于时间与精力，将其维护工作交给了另一位开发者 @Right9ctrl，该开发者获得了 event-stream 的权限后，将恶意代码通过依赖项 flatmap-stream 注入到了 event-stream 中去。也正是这个依赖项引入了窃取比特币的后门。同时，著名的比特币钱包 Dash Copay 在他们的应用中引用了对 event-stream 的依赖，从而导致了中毒事件的发生。梳理下来，黑客的具体步骤如下：第一步，黑客 @right9ctrl 发邮件给这个库的原作者 @dominictarr，而他因为缺乏时间和兴趣已经不愿再维护这个库了，于是就将该库转让给了这个完全不认识的陌生人 。 原作者的解释第二步，9 月 9 日，新维护者开始了初步性的动作，首先释出了 event-stream 3.3.6 版本的更新，并在其中加入了一个全新的模块——flatmap-stream，彼时这个模块中并没有恶意功能。 第三步，9 月 16 日，@right9ctrl 删除了对 flatmap-stream 的引用并在 event-stram 里 手动实现 了这个方法，之后直接将项目从3.3.6 升级到了 4.0.0。但引用npm包的时候，很少有人直接升级大版本，也就是说 codepay 很可能会一直使用这个中毒的 event-stream 3.3.6版本。 黑客的攻击步骤第四步，10 月 5 日，flatmap-stream@0.1.1 版本被一个名为 @hugeglass 的用户推送到了 NPM。而这次释出的更新中该模块就被加入了窃取比特币钱包的用户信息和秘钥。通俗的来说就好比用户的网银账号、密码和U盾一起被盗了。 二、盗窃与曝光盗窃那么黑客的代码具体是怎么盗窃比特币的呢? 通过分析 flatmap-stream 的源码，我们可以将其分解为已下四个步骤：外部代码判断执行环境，如果是在 copay-dash 项目中运行，则将加密成16进制的内部代码进行解密并执行。 内部代码判断用户的使用环境（是否使用 Cordova），同时获取受害者的个人钱包信息。 通过遍历受害者钱包里所有的id，查找账户余额超过100 BTC（市值300万人民币）或者1000 BCH（市值125万人民币）的账户。 将受害者的账户信息和钱包秘钥分别发往部署在吉隆坡的服务器 111.90.151.134 和 copayapi.host（之前DNS解析为：145.249.104.239，目前为：51.38.112.212）。 曝光整个事情的曝光十分具有戏剧性，一个完全不相关的第三方开发者在自己的项目中引入了 Nodemon 监控，但是控制台出现了一条警告 "DeprecationWarning: crypto.createDecipher is deprecated"。crypto是一个常用的加密解密库，最近因为 api 升级，它的 crypto.createDecipher方法已经在新版中废弃，因此系统抛出警告。一个意外将整个事件曝光然而，正常情况下对 nodejs 的监控是不需要进行加密解密的。所以为了解决这个意外的警告，这位热心的开发者将问题上报到了社区。在解决问题的过程中，他们一路向上遍历了他项目的依赖树，最终发现依赖是由 flatmap-stream 引入的。通过解密 flatmap-stream 的代码，由此揭开了整个事件的序幕。攻击与发现三、代码分析现在让我们通过回溯代码来一步步分析黑客是怎么实施他的盗窃的，如果不愿意看详细分析也可以直接跳到章节最后的总结图：）首先，攻击者上传的原始代码 (flatmap-stream@0.1.1)[unpkg.com/flatmap-str…] 是被压缩过的：var Stream=require("stream").Stream;module.exports=function(e,n){var i=new Stream,a=0,o=0,u=!1,f=!1,l=!1,c=0,s=!1,d=(n=n||…

区块链记账原理 | 深入浅出区块链
type: item
date: 2023-03-25T12:01:22+08:00
description: 原文链接：learnblockchain.cn

聊聊我眼中的 Web 3.0
type: item
date: 2023-03-25T12:01:21+08:00
description: 如果你仔细的审视 Web3 世界中的一切，以及资本对 Web3 的热衷程度，你会发现其实 Web3 是一个绕开金融中心化资本管制的网络资本世界。人类的资本形式一直都在发生变化，新资本形式的出现往往代表着一种新的阶级，比如工业革命带来的工业资本，能源革命形成的能源资本，信息技术革命带来的网络资本，代表华尔街金融业的金融资本等等，任何一种资本都需要和某种价值物进行绑定，从而实现资本的价值兑现，当资本绑定的价值物消失或者衰亡，那么资本也随之消失。资本没有国界，也没有种族，资本在全世界所有人类活动的地方都可以存在，但受到各国的资本管制，资本并不是完全自由流动的。但是资本的特征永远都是从低利润率低效率的地方朝着高利润率高效率的地方流动，所谓高效率，高利润，其实就是毫无管制的人类活动区域，没有资本管制，没有任何资本流动的损耗。举个例子，比如非洲，非洲有很多地方是无政府的状态，但是资本为什么没有大量涌入呢？因为效率低，低效率导致资本损耗增大，从而抑制了资本流入。所以让我们看看 Web3 是什么，Web3 所倡导的去中心化就是去监管，避开了现有国家的金融监管这代表了资本自由，举个例子，比如你在某国注册一家企业，然后想通过企业的方式筹措资金，那你需要符合当地的监管调率，通过资本市场以企业的技术，抵押物，或者企业的未来进行融资。但如果你在 Web3 的世界里创建一家虚拟企业，你只需要一个 idea 甚至都不需要一个办公地址和注册资金，你就可以以代币的形式为企业筹集资金，相比传统的企业融资路径，Web3 的效率是极高的，同时也不会有任何组织来审查你的融资过程，完全依托 Web3 世界里的居民自发的去判断是否要参与你的融资，这几乎可以说是资本的天堂。因此 Web3世界里充斥着大量投机和炒作，其根本原因在于资本的高效流动带来的各种财富效应，同时借助现代金融技术，通过杠杠放大了资本，进一步提升了对场外人士的吸引力。确实从赚钱的角度来看，风险和收益是等价的，Web3是世界里的巨大风险自然也伴随着巨大的收益。所以 Web3 是什么？我认为 Web3 不代表任何所谓的未来，Web3本质就是通过代币提供了一种新的资本绑定物，从而创造了一种新的资本，代币资本，基于这种代币资本形成的人类活动区域就是所谓的 Web3.上面我也提到了，任何一种资本的兴盛与消亡要看其绑定物的变化，我们说工业资本，是因为现代社会必须依赖制造业，金融资本，金融活动是现代贸易的基础，以科技企业为代表的数据资本，现代社会几乎离不开互联网，必然会持续的产生数据，能源资本就不说了，能源是工业的基础，可见资本的绑定物本质是基于人类活动需求产生的，而 Web3 中的代币对于我们来说其需求是什么呢？逃脱各国金融监管，代币的一个很大作用在于非法产业的需求，来自世界各国非法组织的活动产生的需求又或者地下钱庄交易，黑市交易等等，这类需求将长期存在，因此代币不可能完全消失，例如 比特币，以太坊的价值永远不可能归零。除非全世界各个国家一起严厉打击，代币的匿名性决定了代币就是非法组织最喜爱的金融工具。其次是投机需求，投机需求在经济繁荣周期会大量释放，各国投机者会大量涌入，从这个角度看，只要代币的基本需求（非法组织活动的金融需求）不消失，那么随着经济周期投机需求就会反反复复。按除这两者之外呢，是否存在对 Web3 的合理且可持续的需求呢？就目前来看 Web3 是一个纯粹的资本世界，并且 Web3 世界里的人正在和现实世界割裂开来，Web3 只能满足 Web3 的需求。不过随着经济周期进入下行周期，Web3 的资本必然会逐步缩减，投机需求被抑制，会进入较为低迷的时期。

比特币源码研读(1)bitcoin源码结构
type: item
date: 2023-03-24T12:02:43+08:00
description: 上篇文章，我们在本地编译了bitcoin源代码。并简单了解了bitcoind和bitcoin-cli的简单使用。这次，我们开始尝试去看看bitcoin源代码的各个模块的作用。用sublime打开bitcoin源代码，我们发现除了除了.h,.cpp等源代码还有一些其他类型的目录和文件。知己知彼，方能百战不殆。所以，我花了点时间大概浏览了下所有的目录和文件。将各个模块代码的功能作了一个初步总结，用于理解bitcoin整体框架和核心模块的代码功能。这样，以后在阅读源代码的时候遇到某些cpp文件也不至于顿时不知所云，必要时可以回过头来参考下这个总结图。废话少说直接撸图可能有些地方总结的不到位，大佬看到可以直接告我下。这个结构图使用Xmind做的，有需要的朋友可以留言索取Xmind源文件。下一篇探索比特币数据结构-区块。互联网颠覆世界，区块链颠覆互联网!--------------------------------------------------20180419 00:06

【译】用JavaScript写一个区块链
type: item
date: 2023-03-24T12:02:42+08:00
description: 原文：Writing a tiny blockchain in JavaScript作者：Savjee.be译者：JeLewine几乎每个人都听说过像比特币和以太币这样的加密货币，但是只有极少数人懂得隐藏在它们背后的技术。在这篇博客中，我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin！全文分为三个部分：part1：实现一个基本的区块链 part2：实现POW part3：交易与挖矿奖励 Part1:实现一个基本的区块链区块链区块链是由一个个任何人都可以访问的区块构成的公共数据库。这好像没什么特别的，不过它们有一个有趣的属性：它们是不可变的。一旦一个区块被添加到区块链中，除非让剩余的其余区块失效，否则它是不会再被改变的。这就是为什么加密货币是基于区块链的原因。你肯定不希望人们在交易完成后再变更交易！创造一个区块区块链是由许许多多的区块链接在一起的（这听上去好像没毛病..）。链上的区块通过某种方式允许我们检测到是否有人操纵了之前的任何区块。那么我们如何确保数据的完整性呢？每个区块都包含一个基于其内容计算出来的hash。同时也包含了前一个区块的hash。下面是一个区块类用JavaScript写出来大致的样子：const SHA256 = require("crypto-js/sha256"); class Block { constructor(index, timestamp, data, previousHash = '') { this.index = index; this.previousHash = previousHash; this.timestamp = timestamp; this.data = data; this.hash = this.calculateHash(); } calculateHash() { return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString(); } } 复制代码因为JavaScript中并不支持sha256所以我引入了crypto-js库。然后我定义了一个构造函数来初始化我区块的属性。每一个区块上都被赋予了index属性来告知我们这个区块在整个链上的位置。我们同时也生成了一个时间戳，以及需要在区块里存储的一些数据。最后是前一个区块的hash。创造一个链现在我们可以在Blockchain类中将区块链接起来了！下面是用JavaScript实现的代码：class Blockchain{ constructor() { this.chain = [this.createGenesisBlock()]; } createGenesisBlock() { return new Block(0, "01/01/2017", "Genesis block", "0"); } getLatestBlock() { return this.chain[this.chain.length - 1]; } addBlock(newBlock) { newBlock.previousHash = this.getLatestBlock().hash; newBlock.hash = newBlock.calculateHash(); this.chain.push(newBlock); } isChainValid() { for (let i = 1; i < this.chain.length; i++){ const currentBlock = this.chain[i]; const previousBlock = this.chain[i - 1]; if (currentBlock.hash !== currentBlock.calculateHash()) { return false; } if (currentBlock.previousHash !== previousBlock.hash) { return false; } } return true; } } 复制代码在构造函数里，我通过创建一个包含创世块的数组来初始化整个链。第一个区块是特殊的，因为它不能指向前一个区块。我还添加了下面两个方法：getLatestBlock()返回我们区块链上最新的区块。 addBlock()负责将新的区块添加到我们的链上。为此，我们将前一个区块的hash添加到我们新的区块中。这样我们就可以保持整个链的完整性。因为只要我们变更了最新区块的内容，我们就需要重新计算它的hash。当计算完成后，…

给Python初学者的最好练手项目
type: item
date: 2023-03-24T12:02:39+08:00
description: 作者：xiaoyu微信公众号：Python数据科学知乎：Python数据分析师有很多朋友问我学习了Python后，有没有什么好的项目可以练手。其实，做项目主要还是根据需求来的。但是对于一个初学者来说，很多复杂的项目没办法独立完成，因此博主挑选了一个非常适合初学者的项目，内容不是很复杂，但是非常有趣，我相信对于初学者小白来说是再好不过的项目了。这个项目中，我们将要建立一个比特币价格的提醒服务。你将主要会学习到HTTP的请求，以及如何使用requests包来发送这些请求。 同时，你会了解webhooks和如何使用它将Python app与外部设备连接，例如移动端手机提醒或者 Telegram 服务。 仅仅不到50行的代码就能完成一个比特币价格提醒服务的功能，并且可以轻松的扩展到其它加密数字货币和服务中。下面我们马上来看看。用Python实现比特币价格提醒我们都知道，比特币是一个变动的东西。你无法真正的知道它的去向。因此，为了避免我们反复的刷新查看最新动态，我们可以做一个Python app来为你工作。为此，我们将会使用一个很流行的自动化网站IFTTT。IFTTT**("if this, then that")**是一个可以在不同app设备与web服务之间建立连接桥梁的工具。我们将会创建两个IFTTT applets：一个是当比特币价格下滑到一定阈值后的紧急提醒 另一个是常规的比特币价格的更新 两个程序都将被我们的Python app触发，Python app从Coinmakercap API 点这里 获取数据。一个IFTTT程序有两个部分组成：触发部分和动作部分。在我们的情况下，触发是一个IFTTT提供的webhook服务。你可以将webhook想象为"user-defined HTTP callbacks"，更多请参考：WEBHOOK我们的Python app将会发出一个HTTP请求到webhook URL，然后webhook URL触发动作。有意思的部分来了，这个动作可以是你想要的任何东西。IFTTT提供了众多的动作像发送一个email，更新一个Google电子数据表，甚至可以给你打电话。配置项目如果你安装了python3，那么只要再安装一个requests包就可以了。$ pip install requests==2.18.4 # We only need the requests package 复制代码选一个编辑器，比如Pycharm进行代码编辑。获取比特币价格代码很简单，可以在console中进行。导入requests包，然后定义bitcoin_api_url变量，这个变量是Coinmarketcap API的URL。接着，使用requests.get()函数发送一个 HTTP GET请求，然后保存响应response。由于API返回一个JSON响应，我们可以通过.json()将它转换为python对象。>>>import requests >>>bitcoin_api_url = 'https://api.coinmarketcap.com/v1/ticker/bitcoin/' >>>response = requests.get(bitcoin_api_url) >>>response_json = response.json() >>>type(response_json) # The API returns a list <class 'list'> >>># Bitcoin data is the first element of the list >>>response_json[0] {'id': 'bitcoin', 'name': 'Bitcoin', 'symbol': 'BTC', 'rank': '1', 'price_usd': '10226.7', 'price_btc': '1.0', '24h_volume_usd': '7585280000.0', 'market_cap_usd': '172661078165', 'available_supply': '16883362.0', 'total_supply': '16883362.0', 'max_supply': '21000000.0', 'percent_change_1h': '0.67', 'percent_change_24h': '0.78', 'percent_change_7d': '-4.79', 'last_updated': '1519465767'} 复制代码上面我们感兴趣的是price_usd。发送一个测试的IFTTT提醒现在我们可以转到IFTTT上面来了。使用IFTTT之前，我们需要创建一个新账户IF…