区块链技术想要快速入门,一般涉及哪些编程语言?

发布网友 发布时间:2022-04-23 13:39

我来回答

8个回答

懂视网 时间:2022-05-15 04:22

很多朋友都听说过比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术,接下来通过本文给大家介绍用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的,感兴趣的朋友一起看看吧

几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术。在这篇文中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的。我将会称之为SavjeeCoin!

全文分为三个部分:

  1. part1:实现一个基本的区块链

  2. part2:实现POW

  3. part3:交易与挖矿奖励

Part1:实现一个基本的区块链

区块链

区块链是由一个个任何人都可以访问的区块构成的公共数据库。这好像没什么特别的,不过它们有一个有趣的属性:它们是不可变的。一旦一个区块被添加到区块链中,除非让剩余的其余区块失效,否则它是不会再被改变的。

这就是为什么加密货币是基于区块链的原因。你肯定不希望人们在交易完成后再变更交易!

创造一个区块

区块链是由许许多多的区块链接在一起的(这听上去好像没毛病..)。链上的区块通过某种方式允许我们检测到是否有人操纵了之前的任何区块。

那么我们如何确保数据的完整性呢?每个区块都包含一个基于其内容计算出来的hash。同时也包含了前一个区块的hash。

下面是一个区块类用JavaScript写出来大致的样子:

因为JavaScript中并不支持sha256所以我引入了 crypto-js 库。然后我定义了一个构造函数来初始化我区块的属性。每一个区块上都被赋予了 index 属性来告知我们这个区块在整个链上的位置。我们同时也生成了一个时间戳,以及需要在区块里存储的一些数据。最后是前一个区块的hash。

创造一个链

现在我们可以在Blockchain类中将区块链接起来了!下面是用JavaScript实现的代码:

在构造函数里,我通过创建一个包含创世块的数组来初始化整个链。第一个区块是特殊的,因为它不能指向前一个区块。我还添加了下面两个方法:

  • getLatestBlock() 返回我们区块链上最新的区块。

  • addBlock() 负责将新的区块添加到我们的链上。为此,我们将前一个区块的hash添加到我们新的区块中。这样我们就可以保持整个链的完整性。因为只要我们变更了最新区块的内容,我们就需要重新计算它的hash。当计算完成后,我将把这个区块推进链里(一个数组)。

  • 最后,我创建一个 isChainValid() 来确保没有人篡改过区块链。它会遍历所有的区块来检查每个区块的hash是否正确。它会通过比较 previousHash 来检查每个区块是否指向正确的上一个区块。如果一切都没有问题它会返回 true 否则会返回 false 。

    使用区块链

    我们的区块链类已经写完啦,可以真正的开始使用它了!

    在这里我仅仅是创建了一个区块链的实例,并且命名它为SavjeeCoin!之后我在链上添加了一些区块。区块里可以包含任何你想要放的数据,不过在上面的代码里,我选择添加了一个带有 amount 属性的对象。

    试着操作吧!

    在介绍里我曾说过区块链是不可变的。一旦添加,区块就不可能再变更了。让我们试一下!

    我会在一开始通过运行 isChainValid() 来验证整个链的完整性。我们操作过任何区块,所以它会返回true。

    之后我将链上的第一个(索引为1)区块的数据进行了变更。之后我再次检查整个链的完整性,发现它返回了false。我们的整个链不再有效了。

    结论

    这个小栗子还远未达到完成的程度。它还没有实现POW(工作量证明机制)或P2P网络来与其它矿工来进行交流。

    但他确实证明了区块链的工作原理。许多人认为原理会非常复杂,但这篇文章证明了区块链的基本概念是非常容易理解和实现的。

    Part2:实现POW(proof-of-work:工作量证明)

    在part1中我们用JavaScript创建了一个简单的区块链来演示区块链的工作原理。不过这个实现并不完整,很多人发现依旧可以篡改该系统。没错!我们的区块链需要另一种机制来抵御攻击。那么让我们来看看我们该如何做到这一点!

    问题

    现在我们可以很快的创造区块然后非常迅速的将它们添加进我们的区块链中。不过这导致了三个问题:

  • 第一:人们可以快速创建区块然后在我们的链里塞满垃圾。大量的区块会导致我们区块链过载并让其无法使用。

  • 第二:因为创建一个有效的区块太容易了,人们可以篡改链中的某一个区块,然后重新计算所有区块的hash。即使它们已经篡改了区块,他们仍然可以以有效的区块来作为结束。

  • 第三:你可以通过结合上述两个破绽来有效控制区块链。区块链由p2p网络驱动,其中节点会将区块添加到可用的最长链中。所以你可以篡改区块,然后计算所有其他的区块,最后添加多任意你想要添加的区块。你最后会得到一个最长的链,所有的其它节点都会接受它然后往上添加自己的区块。

  • 显然我们需要一个方案来解决这些问题:POW。

    什么是POW

    POW是在第一个区块链被创造之前就已经存在的一种机制。这是一项简单的技术,通过一定数量的计算来防止滥用。工作量是防止垃圾填充和篡改的关键。如果它需要大量的算力,那么填充垃圾就不再值得。

    比特币通过要求hash以特定0的数目来实现POW。这也被称之为 难度

    不过等一下!一个区块的hash怎么可以改变呢?在比特币的场景下,一个区块包含有各种金融交易信息。我们肯定不希望为了获取正确的hash而混淆了那些数据。

    为了解决这个问题,区块链添加了一个 nonce 值。Nonce是用来查找一个有效Hash的次数。而且,因为无法预测hash函数的输出,因此在获得满足难度条件的hash之前,只能大量组合尝试。寻找到一个有效的hash(创建一个新的区块)在圈内称之为挖矿。

    在比特币的场景下,POW确保每10分钟只能添加一个区块。你可以想象垃圾填充者需要多大的算力来创造一个新区块,他们很难欺骗网络,更不要说篡改整个链。

    实现POW

    我们该如何实现呢?我们先来修改我们区块类并在其构造函数中添加Nonce变量。我会初始化它并将其值设置为0。


    我们还需要一个新的方法来增加Nonce,直到我们获得一个有效hash。强调一下,这是由难度决定的。所以我们会收到作为参数的难度。


    最后,我们还需要更改一下 calculateHash() 函数。因为目前他还没有使用Nonce来计算hash。

    将它们结合在一起,你会得到如下所示的区块类:

    修改区块链

    现在,我们的区块已经拥有Nonce并且可以被开采了,我们还需要确保我们的区块链支持这种新的行为。让我们先在区块链中添加一个新的属性来跟踪整条链的难度。我会将它设置为2(这意味着区块的hash必须以2个0开头)。


    现在剩下要做的就是改变 addBlock() 方法,以便在将其添加到链中之前确保实际挖到该区块。下面我们将难度传给区块。


    大功告成!我们的区块链现在拥有了POW来抵御攻击了。

    测试

    现在让我们来测试一下我们的区块链,看看在POW下添加一个新区块会有什么效果。我将会使用之前的代码。我们将创建一个新的区块链实例然后往里添加2个区块。

    如果你运行了上面的代码,你会发现添加新区块依旧非常快。这是因为目前的难度只有2(或者你的电脑性能非常好)。

    如果你创建了一个难度为5的区块链实例,你会发现你的电脑会花费大概十秒钟来挖矿。随着难度的提升,你的防御攻击的保护程度越高。

    免责声明

    就像之前说的:这绝不是一个完整的区块链。它仍然缺少很多功能(像P2P网路)。这只是为了说明区块链的工作原理。

    并且:由于单线程的原因,用JavaScript来挖矿并不快。

    Part3:交易与挖矿奖励

    在前面两部分我们创建了一个简单的区块链,并且加入了POW来抵御攻击。然而我们在途中也偷了懒:我们的区块链只能在一个区块中存储一笔交易,而且矿工没有奖励。现在,让我们解决这个问题!

    重构区块类

    现在一个区块拥有 index , previousHash , timestamp , data , hash 和 nonce 属性。这个 index 属性并不是很有用,事实上我甚至不知道为什么开始我要将它添加进去。所以我把它移除了,同时将 data 改名为 transactions 来更语义化。


    当我们改变区块类时,我们也必须更改 calculateHash() 函数。现在它还在使用老旧的 index 和 data 属性。

    交易类

    在区块内,我们将可以存储多笔交易。因此我们还需要定义一个交易类,一边我们可以锁定交易应当具有的属性:

    这个交易例子非常的简单,仅仅包含了发起方( fromAddress )和接受方( toAddress )以及数量。如果有需求,你也可以在里面加入更多字段,不过这个只是为了最小实现。

    调整我们的区块链

    当前的最大任务:调整我们的区块链来适应这些新变化。我们需要做的第一件事就是存储待处理交易的地方。

    正如你所知道的,由于POW,区块链可以稳定的创建区块。在比特币的场景下,难度被设置成大约每10分钟创建一个新区块。但是,是可以在创造两个区块之间提交新的交易。

    为了做到这一点,首先需要改变我们区块链的构造函数,以便他可以存储待处理的交易。我们还将创造一个新的属性,用于定义矿工获得多少钱作为奖励:


    下一步,我们将调整我们的 addBlock() 方法。不过我的调整是指删掉并重写它!我们将不再允许人们直接为链上添加区块。相反,他们必须将交易添加至下一个区块中。而且我们将 addBlock() 更名为 createTransaction() ,这看起来更语义化:


    挖矿

    人们现在可以将新的交易添加到待处理交易的列表中。但无论如何,我们需要将他们清理掉并移入实际的区块中。为此,我们来创建一个 minePendingTransactions() 方法。这个方法不仅会挖掘所有待交易的新区块,而且还会向采矿者发送奖励。


    请注意,该方法采用了参数 miningRewardAddress 。如果你开始挖矿,你可以将你的钱包地址传递给此方法。一旦成功挖到矿,系统将创建一个新的交易来给你挖矿奖励(在这个栗子里是100枚币)。

    有一点需要注意的是,在这个栗子中,我们将所有待处理交易一并添加到一个区块中。但实际上,由于区块的大小是有的,所以这是行不通的。在比特币里,一个区块的大小大概是2Mb。如果有更多的交易能够挤进一个区块,那么矿工可以选择哪些交易达成哪些交易不达成(通常情况下费用更高的交易容易获胜)。

    地址的余额

    在测试我们的代码钱让我们再做一件事!如果能够检查我们区块链上地址的余额将会更好。

    测试

    好吧,我们已经完成并可以最终一切是否可以正常工作!为此,我们创建了一些交易:

    这些交易目前都处于等待状态,为了让他们得到证实,我们必须开始挖矿:

    当我们开始挖矿,我们也会传递一个我们想要获得挖矿奖励的地址。在这种情况下,我的地址是 xaviers-address (非常复杂!)。

    之后,让我们检查一下 xaviers-address 的账户余额:

    输出: 0


    我的账户输出竟然是0?!等等,为什么?难道我不应该得到我的挖矿奖励么?那么,如果你仔细观察代码,你会看到系统会创建一个交易,然后将您的挖矿奖励添加为新的待处理交易。这笔交易将会包含在下一个区块中。所以如果我们再次开始挖矿,我们将收到我们的100枚硬币奖励!

    输出: 100

    局限性与结论

    现在我们的区块链已经可以在一个区块上存储多笔交易,并且可以为矿工带来回报。

    不过,还是有一些不足:发送货币是,我们不检查发起人是否有足够的余额来实际进行交易。然而,这其实是一件容易解决的事情。我们也没有创建一个新的钱包和签名交易(传统上用公钥/私钥加密完成)。

    上面是我整理给大家的,希望今后会对大家有帮助。

    相关文章:

    vue-cli创建的项目,配置多页面的实现方法

    web3.js增加eth.getRawTransactionByHash(txhash)方法步骤

    nodejs简单访问及操作mysql数据库的方法示例

    热心网友 时间:2022-05-15 01:30

    任何一门计算机语言,都能在特定某个领域的应用中,实现区块链技术;

    具体使用哪一门语言,完全看我们相应领域行业企业项目的技术要求,以及更关键的:跟已有信息系统的有效对接联通

    区块链具有自下而上生成记录,生成两方或多方合同类记录,加入第三方确认机制,分布存储,……等特点;

    从而让它相比集中式的存储运算而言,变得更为可信。

    常见的总统投票,就非常适合以区块链技术重新架构;采用区块链技术的投票系统,能够避免哪一家技术公司、某一个关键技术人员,操纵选票统计结果的可能。

    像我们的*证据,也特别适合采用区块链技术重新架构开发。

    其实像当前我们各类互联网时代的“版权系统”,它们中一些就是采用区块链技术架构而来,只不过,目前我们的新闻出版局、专利局(或者更广义地被称作“专家评委”),都尚未接入这些由互联网公司创新而来的版权平台。

    我们耳熟能详 的“法大大”(虽然名字不甚好听、甚至乍一听来有些让人“摸不着头脑”),它也其实正准备采用最新的区块链技术重新架构;采用区块链技术的合同平台,因为变得更加可信,也才能更便于互联网时代人们签订各类商务合同。

    还有像我们的“征信系统”,也非常适合以区块链技术加以改造。能够让它更有说服力,而不致于出现一家单位、乃至随意某个关键技术人员,能随意往其中添加“征信污点数据”的情况。

    还有像我们的P2P贷款,如果能够以区块链技术重新架构的话,也能够变得更加可信,而不致于出现违约、卷款跑路这样的失信情况。


    热心网友 时间:2022-05-15 02:48

      想要快速入门,一般先推荐JAVA开发语言。Java是一种面向对象的编程语言,不仅吸收了c++语言的优点,也抛弃了在c++、指针等概念中难以理解多重继承的困难,因此Java语言具有强大且易于使用的两个特性100va的特点是简单、面向对象、分布式、促壮、安全、平*立性和可移植性、多线程和动态。它结合了解释语言的灵活性、动态类型语言的开发效率和静态类型的安全性。它还打算成为一种支持网络核计算的现代语言。

      为了实现这些目标,需要解决一些语言问题:一个具有表达性但轻量级的类型系统、并发和垃圾收集机制、严格的依赖规则等等。这些不能通过库或工具来解决,所以创建。Solidity开发语言Solidity是在Ethereum虚拟机(EVM)上运行的智能契约的高级语言。它的语法接近于Javascript,是一种面向对象的语言。但是当涉及到把网络作为一个真正的东西的时候,这是非常不同的。

     其次,也非常推荐一些必读书目。

    在go语言编程篇书籍参考:《Go语言编程》该书由人民邮电出版社出版,内容是从最基础的语法进行讲解,对于初学者而言,可以通过此书学习到Go 语言的语法特性,语法规则,掌握基本的Go语言编程能力。

    该书最大的特点就是在前几章的基础语法以后,按照模块进行知识的讲解,比如网络编程,异常处理,并发编程都独自作为章节进行阐述。对于初学者而言,可以选择好好看一看。《Go Web编程》:该书是由外国人所著,国内为翻译版。本书的内容是专门为Go语言的Web开发而写。通过该书,能够使之前没有开发过Web项目的朋友积累web开发的技能,掌握Go语言Web开发的一些必要技能,这是对初学者而言,这本书是开发者走向架构师之路的级别的书。

    热心网友 时间:2022-05-15 04:23

    区块链一般涉及的入门编程语言有 cpp语言、 go语言、rust语言 、Haskell语言等,我个人觉得无论用什么语言来做区块链,都必须要先理解这种去中心化的思想和价值所在,语言是其次。

    热心网友 时间:2022-05-15 06:14

    必须要涉及到Python,还有R语言,Python可以说是非常智能的语言,而R语言则是大数据运用做多的语言,所以想做区块链技术的话必须要学会这两门语言。

    热心网友 时间:2022-05-15 08:22

    区块链技术涉及到的编程语言:Javascript、C++、C#、Python、Golang、Solidity、Rust等等。

    热心网友 时间:2022-05-15 10:47

    首先你得去了解区块链的技术,了解之后区块链可以用各种语言实现的,有的喜欢用Javascript,有的用python,主要还是得先去了解区块链的原理。

    热心网友 时间:2022-05-15 13:28

    语言并不是关键点,懂得原理以后,可以用各种语言实现, 但是,由于以太坊和Hyperledger Fabric 对go语言支持最好,所以go语言肯定是要学习的。

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com