精华内容
下载资源
问答
  • 内容|Space-O Technologies编译|Aholiab以太坊是区块链开发领域最好的编程平台,而Truffle是以太坊(Ethereum)最受欢迎的一个开发框架,最近营长也收到很多询问如何开发Dapp的咨询,这是我们营长今天打算介绍一下...
        

    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

    内容 | Space-O Technologies

    编译 Aholiab



    以太坊是区块链开发领域最好的编程平台,而Truffle是以太坊(Ethereum)最受欢迎的一个开发框架,最近营长也收到很多询问如何开发Dapp的咨询,这是我们营长今天打算介绍一下Truffle的原因。


    俗话说,Talk is cheap,实战是最重要的事情,这篇文章不讲原理,只讲如何搭建环境,手把手教你运行第一个区块链程序(Dapp)



    什么是以太坊Dapp?


    简单来说,以太坊Dapp是一个去中心化的web应用,这个应用可以被内嵌到以太坊的网络中。与一般的web应用相比,以太坊Dapp在以下两点有所不同。


    • 以太坊Dapp是与以太网的网络进行交互,而不是服务器;

    • 以太坊Dapp需要用特定的浏览器来打开,因为普通的浏览器无法连接到以太坊的网络中。


    不过以太坊也提供了一个叫做Web3的JavaScript API,用以接入以太坊的网络。而今天我们要谈的MetaMask和Mist是两个Web3上的浏览器,这两个浏览器相互兼容。而与其把MetaMask成为浏览器,不如把他看成一个Chrome浏览器的插件。


    如果你已经有Node.js基础并且做过一些web开发,那么这篇文章就刚好是为你写的。


    开发以太坊Dapp需要用到以下三个工具:


    • Truffle

    • TestRPC

    • MetaMask



    关于三个开发工具


    在使用这三个工具开发前,我们先来了解一下上面提到的这三个工具。


    Truffle。Truffle是以太坊最受欢迎的开发框架,同时他也是开发环境和asset pipeline,它的作用是帮助开发者在区块链上部署智能合约,包括用新的合约来替换旧的合约,以及在已经部署的合约上挂载前端。


    简单来说,Truffle提供了很多实用的功能,包括对合约部署的管理,与合约交互的概念,以及对合约的测试支持等。


    TestRPC。TestRPC是一个基于Node.js的使用内存模拟的一个以太坊环境,它主要用于开发和测试。TestRPC完全运行在本地,因此运行速度比以太坊的真实环境快很多,是目前比较好的开发和测试环境。不过TestRPC只能用于开发,对于产品层面的帮助不大。你可以再上面部署合约,并且像在以太坊的真实环境中一样与合约进行交互。


    MetaMask。正如前文所说,MetaMask是一款在Chrome上使用的插件类型的以太坊钱包。用户不需要下载,需要再Chrome浏览器上添加对应的扩展程序即可,非常轻量。简单来说,MetaMask允许用户与在Chrome中与Dapps进行交互。


    640?wx_fmt=jpeg



    闲话少说,说干就干!


    接下来就跟着营长开发你的第一个Dapp吧!假定你是第一次开发Dapp,那么首先你要安装NPM(Node Package Manager),在NPM安装完成后,我们依次安装Truffle和TestRPC。


    这里提一下NPM和NPM的安装。NPM的作用是帮助开发者分享和复用代码,也可以通过它来更新已经分享的代码


    由于NPM分部在Node.js之上,因此你需要先下载Node.js,当Node.js下载完成后,NPM就已经被自动安装了。这时你可以通过以下代码进行检验。

    小提示:

    Node.js支持Windows、Linux、Mac OS X系统。推荐使用Mac OS X,不建议使用Windows,会碰到各种各样的问题,导致放弃。



    输入以下命令,检查Node.js是否被安装:


    640?wx_fmt=png


    输入以下命令,检查NPM是否被安装:


    640?wx_fmt=png


    关于NPM的安装,你还可以在以下地址查看详细的安装步骤:


    https://www.npmjs.com/get-npm



    第1步:安装TestRPC


    开发以太坊Dapp,第一件要做的事情就是安装TestRPC。最简单的安装方法就是「全局安装」(Globally),你可以通过以下命令来实现:


    640?wx_fmt=png


    需要留意的是,TestRPC需要Node.js的版本在6.9.1以上,如果你安装的版本较低,可以通过版本切换工具nvm去切换不同的版本


    安装完之后,你就可以新建第一个项目了。可以通过以下命令实现:

    $ mkdir zhaoxi

    $ cd zhaoxi

    $ truffle init


    这时会默认生成一个MetaCoin的Demo,可以从这个Demo中学习Truffle的架构。


    项目目录结构如下图所示:


    640?wx_fmt=png


    项目所有文件目录如下图所示:

    640?wx_fmt=jpeg


    第2步:安装Truffle


    接下来就进入到了Truffle的安装,Truffle是眼下最受欢迎的以太坊开发框架,最简单的安装方法是将其安装为一个全局NPM包(global npm package)。你可以通过以下代码来安装Truffle:


    640?wx_fmt=png



    第3步:安装MetaMask


    你可以在以下地址安装MetaMask:


    https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=en


    640?wx_fmt=png


    安装完MetaMask后,我们就开始进入正式的Dapp的开发了。首先我们需要在后台运行TestRPC。



    第4步:运行TestRPC


    通过以下代码,我们可以很简单地运行TestRPC:


    640?wx_fmt=png


    这一指令将启动开发环境,并且生成用以太币进行先行融资(Prefunded)的账户列表,以及与各账户对应的私钥。



    第5步:完成你的第一个Dapp!


    到这一步,开发环境已经搭建好,可以开始部署你的第一个以太坊Dapp了!这里我们先生成一个最简单的Dapp,也就是Truffle中系统默认的货币类型。


    可以通过以下代码来实现:


    640?wx_fmt=png


    大功告成!是不是很简单呢?现在你可以在你的浏览器上,通过这个网址查看你的Dapp了:http://localhost:8080


    接下来到了你大显身手的时候了,去在这个Dapp上实现你的idea吧!


    在未来的文章中,营长还将继续为大家带来通过Solidity语言创建以太坊智能合约,并给出更多的实践示例。


    本文编译自:Space-O Technologies;博主@jeason29对本文亦有贡献;

    原文链接:https://www.spaceotechnologies.com/develop-ethereum-dapp-metamask-truffle-tutorial/



    你可能也对以下内容感兴趣:

    如何成为一名区块链工程师? | 附学习资源

    刚入门区块链的程序员应该看些什么?

    快速上手!部署超级账本 Fabric 1.0 超详细教程

    底层技术大对比!分分钟带你看透区块链和云计算



    640?wx_fmt=gif



    营长招人啦

    CSDN区块链大本营招采编2名:

    1. 对区块链技术有一定的理解,对大公司动态有极强敏感性,且有深度剖析的楞劲儿。

    2. 出稿速度快,具有每天报题和出稿的能力。

    3. 有能力采访行业高端人物,能将其观点进行深刻呈现。

    4. 相关媒体经验2年以上。

    5. 英语6级以上,能快速编译。

    6. 本科以上


    待遇:

    绝不低于行业水平,只要有才,我们愿意给你一切资源

    邮件发送:puge@csdn.net

    邮件注明:姓名+区块链+采编应聘






    展开全文
  • 既了解区块链底层原理、又熟悉以太坊架构、还能基于以太坊开发DApp的专业人才,也成为了各大公司发力区块链技术储备的重点对象。【课程简介】本套以太坊课程,对以太坊基础理论知识和架构做了系统的梳理和深入的阐述...
  • DApp概念和web3.py介绍简单来说,DAPP和普通的App原理一样,除了他们是完全去中心化的,由类似以太坊网络本身自己的节点来运作的DAPP,不依赖于任何中心化的服务器,DAPP是去中心化的,可以完全自动地运行DAPP是...

    4fa9693167f5d543b700452442b4aabb.png

    DApp概念和web3.py介绍

    简单来说,DAPP和普通的App原理一样,除了他们是完全去中心化的,由类似以太坊网络本身自己的节点来运作的DAPP,不依赖于任何中心化的服务器,DAPP是去中心化的,可以完全自动地运行。

    DAPP是Decentralized Application的缩写,中文叫分布式应用/去中心化应用,通常来说,不同的DAPP会采用不同的底层区块链开发平台和共识机制,或者自行发布代币(也可以使用基于相同区块链平台的通用代币)。

    下面我们来介绍一下DApp开发,不可否认的是,对于DApp开发来说,主要挑战之一就是在于将智能合约与网站前端连接起来。最高效的方法是使用Web3库(Python或Javascript)来实现。这对于Javascript开发者来说可能很快完成,因为网上有许多Web3.js的教程,但对于Python开发者而言并不容易。

    web3.py 是一个纯Python JSON-RPC 打包,用于与Ethereum以太坊节点进行通信。如需使用这个库,则需要一个运行中的Ethereum节点,并启用HTTP 或 IPC。虽然Web3.js社区非常庞大,但是Web3.py在Github上也拥有超过1.5k的星标,同时拥有133个贡献者以及一些具有吸引力的以太坊API。web3.py社区足够成熟,所以Python开发人员完全可以基于Web3.py来开发区块链DAPP。

    开发所需工具

    1、Remix IDE:一个开源IDE,不仅可以让你编写智能合约,而且还支持智能合约的测试,调试和部署。阅读官方文档以获取更多信息:https://remix-ide.readthedocs.io/en/latest/

    2、Infura:一个托管的以太坊节点集群,可以将你开发的以太坊智能合约部署到infura提供的节点上,而无需搭建自己的以太坊节点。

    3、Django 3.0:一个基于Python的开源网络框架,可以快速开发安全和可维护的网站。

    python -m pip install Django

    4、Web3.py:使我们能够与智能合约对话并调用其功能的工具。web3.py官方文档:https://web3py.readthedocs.io/en/stable/

    pip3 install web3

    接入区块链网络

    首先,如下所示将 Remix 上的环境更改为Injected Web3,然后连接到Metamask上的Ropsten Network

    25889fff30e94819b83c203097476269.png

    在开发前,我们首先设置与区块链的安全可靠连接。如果没有Infura的话很难实现,现在我们只需要一个Infura API密钥。遵循以下步骤可以获取API Keyhttps://ethereumico.io/knowledge-base/infura-api-key-guide/

    当获得API密钥并安装了上述工具,便可以进行下一步了。注意,为了确保项目的进行,您可能需要获取ROPSTEN Network的 Infura 密钥。

    连接到WEB3.PY并开始交互

    a7e5337c16c380f8796e95871bdf6f6a.png

    尽管此代码已经很清晰了,但这只是一个基本设置,我们还需要一些其它必要的因素,例如:

    a、用于签署交易的私钥和公钥

    b、为 web3创建一个HTTPProvider

    c、存储智能合约的ABI和地址

    d、通过传输ABIAddress作为参数来创建智能合约实例

    现在我们通过智能合约有了一些安全的设置。但是,在掌握如何调用智能合约之前,首先要了解一下我们可以进行哪种类型的调用。

    你想从智能合约中获取什么?

    尽管我们可以执行多种功能,下面5项可能是最重要的:

    a、从智能合约调用一个Getter函数:

    a3b6363166e87c4f2f7553bea729779d.png

    虽然这似乎有些复杂,但是您可以按照下面提到的那样使用简单的方法来调用getter函数。

    b、调用一个简单的Read_Only函数(简单方式):

    94b6e6b78e3d94c905451a10372eaf64.png

    智能合约中的read_only函数可以看作是仅在调用时返回特定数据的函数。例如,带有view关键字的此get_count函数仅在调用时返回post总数。

    Solidity 代码写法如下:

    function get_count() view public returns(uint){
    return postCount;
    }

    为了方便调用,我们需要用一条简单的代码行来实现这些函数。以上就是我们需要做的。

    c、用函数来实现Transaction(交易)

    由于我们已经知道Read_Only函数,因此智能合约中可能还有其他函数会要求传递一些参数然后执行某些功能。用区块链技术术语来讲,调用这些函数被视为进行了一次交易,因为此类函数调用时会产生Gas价格。

    让我们在智能合约中加入以下功能,Solidity 代码写法如下:

    function createPost(string memory _content) public
    {
    require(bytes(_content).length > 0);
    postCount++;
    posts[postCount] = Post(postCount,_content,0,msg.sender);
    emit PostCreated(postCount,_content,0,msg.sender);
    }

    此代码从用户那里获取content参数,然后将其添加到post列表中。当用户尝试更新区块链上的特定数据时,需要调用此类transaction进行一些操作。这样便形成一次交易。

    那么如何进行交易呢?

    00514725d170bd928e5466295d1fa058.png

    这是一个复杂的过程,我们来分步解释。如第259行所示,我们没有调用函数createPost,而是建立了一个transaction。但是,buildTransaction函数接收了一个字典形式的数据作为参数。

    ``chainId:由于每个以太坊网络都有它的ID,简单来说就是代表我们连接的网络ID,在本例中3代表Ropsten`网络。

    gas:我们已经知道执行每笔交易都需要gas,这个参数代表我们需要支付交易的最多的gas数量。

    gasPrice: 表示以Wei为单位的'gas'单价

    nonce: 表示用户前一次交易的计数

    当我们根据自己项目的情况填写了参数后,就可以用signTransaction函数来对该交易进行签名了。该函数将此交易和私钥作为参数。

    最后,当我们使用waitForTransactionReceipt函数收到交易回执时,便知道交易已完成。一旦获得此交易回执,就可以确保交易记录已成功添加到区块链中。

    d、用以太币进行付款

    f4ac5c3936f36e08458f780d27407a66.png

    如前所述,将以太币发送到一个智能合约或其他帐户也涉及类似以下的步骤,如建立交易,使用私钥签名以及获得确认交易回执。

    但是,它涉及另外两个领域,例如:

    to:表示交易的接收者

    value:表示交易量

    好了,这就是从一个帐户到另一个帐户进行转账交易所需要做的准备。

    e、调用事件

    首先我们需要明白什么是“事件”。在Solidity中,事件可以看作是交易日志中的实时记录,它不仅存储在区块链中,而且如果给定一个时间,可以借助智能合约来寻址。

    尽管在文中代码没有使用任何事件,但在Web3.py的官方文档中我们可以了解调用事件的详细过程。

    myContract = web3.eth.contract(address=contract_address, abi=contract_abi)
    tx_hash = myContract.functions.myFunction().transact()
    receipt = web3.eth.getTransactionReceipt(tx_hash)
    myContract.events.myEvent().processReceipt(receipt)

    以上这些就是在与智能合约进行交互时可能要使用的调用方法。

    尽管我们已经很清楚地了解了使用web3.py与智能合约进行交互并调用特定函数的过程,但仍有最后一件事需要理解,即智能合约返回数据后我们需要做什么?

    由于我们使用的是Django网络框架,因此非常需要了解它是如何处理智能合约的响应并根据需要使用它。

    在Django中处理智能合约的反馈

    智能合约有两种可能的反馈方式:

    第一种情况,我们可能进行了一笔交易(向区块链中添加了一些东西或进行了付款)。在这种情况下,只需简单地获取交易回执。因为我们只需要确认交易确实已执行即可,其它都不需要做。

    第二种情况,我们可能需要调用一个返回数据列表的函数。嗯,这就是我们真正感兴趣的。让我们分析一些代码来了解第二种情况。

    posts_data传递到模板的函数

    6f908ed7e7fd747af5538f63dc1961ca.png

    在这里,我们实际上所做的只是调用get_posts_from_contract()函数。从智能合约调用post数组的功能。

    cc114dbac329db812cfd6f22a5a911b5.png

    我们的智能合约包含一系列数据,这些数据包含来自用户的所有post,其打赏额以及作者的地址。在此函数中,我们只需调用该数组并返回它。

    因此,当posts()函数调用get_post_from_smart_contract()函数时,它基本上会获取嵌套的数据列表。

    0e047a0d1b80d5456ab205ba15dbf6d2.png

    现在出现的最关键的问题是,我们如何处理模板中的这个列表?

    Django中的模板部分

    由于智能合约中的数据是嵌套列表,因此在Django模板中处理数据列表的有效方法如下:

    {% for data in data_from_views.py %}

    ...

    {{ data.0 }}

    {{ data.1 }}...
    {% endfor %}

    这正是我们在模板中处理它的方式。代码如下所示:

    37a9e5eb285d63aa10cf9bbff2af98f1.png

    总结

    我们不仅学习了用Python进行智能合约交互的整个过程,而且还以我们想要的方式来处理其响应。

    64af406f517faa21241b1df92eb4776f.png

    如果将其部署到服务器上运行,上面的模板就会呈现出来,你将拥有一个完整的DApp网站,不仅可以与区块链进行交互,还可以在其上进行交易和读写。

    77e92b2a0a8c107d20b2d7bc851e75da.png

    4c86c4135a750aad5dc9c09425ea8bb3.png

    展开全文
  • 今天,就带你轻松学习以太坊的工作原理。 1 以太坊概览 使用Solidity编程语言编写智能合约。智能合约完全按照程序运行,而且防停机、防审查、防欺诈、防第三方干扰。部署智能合约或者调用其方法需要用到以太币...

    都说学习以太坊,先看以太坊白皮书,BUT…辣么长的白皮书怎么搞呢?今天,就带你轻松学习以太坊的工作原理。


    1 以太坊概览

    使用Solidity编程语言编写智能合约。智能合约完全按照程序运行,而且防停机、防审查、防欺诈、防第三方干扰。部署智能合约或者调用其方法需要用到以太币。

    以太坊使用区块链数据结构和工作量证明共识协议。有两种网络中的节点:普通节点和矿工。普通节点只备份区块链上的数据,而矿工通过挖矿创建区块链。

    2 以太坊账户

    要创建以太坊账户,只需要一个非对称加密密钥对——由不同的算法(例如RSA、ECC等)生成。以太坊使用椭圆曲线加密算法(ECC),ECC有多个参数用来调节速度和安全性,以太坊使用 secp256k1参数。

    每个账户用一个地址表示。有了密钥之后,就需要生成地址。

    从公钥生成地址的过程如下:

    (1)生成公钥的keccak-256哈希。它将给出一个256位的数字。
    (2)丢弃前面的96位,即12字节。现在得到160位二进制数据,即20字节。
    (3)把地址编译成十六进制的字符串。最后将得到一个40字符的字
    节串,就是账户地址。

    3 交易

    交易是一个签名数据包,用于从一个账户向另一个账户或者向一个合约转以太币、调用合约方法或者部署一个新合约。

    交易使用椭圆曲线数字签名算法(ECDSA)签名,ECDSA是一种基于ECC的数字签名算法。

    交易包含:

    • 信息接收者
    • 识别发起人及其意愿的签名
    • 要转账的以太币数量
    • 交易执行允许进行的计算资源最大值(叫作gas上限)
    • 交易发起人愿意为单位计算资源支付的费用(叫作gas价格)

    如果交易目的是调用合约方法,则还包含输入数据。

    如果其目的是部署合约,则可以包含初始化代码。 用交易所消耗的gas乘以gas价格计算得到交易费。

    4 共识

    用户需要确保节点不能够篡改区块链,还需要一个机制检查区块是否合法。

    以太坊使用工作量证明共识协议防止区块链被篡改。

    工作量证明系统需要解决一个复杂问题以创建一个新的区块。

    在工作量证明系统中,创建区块的过程称为挖矿.

    矿工(miner)是网络中挖区块的节点。矿工一旦成功挖到区块,就向网络中的所有其他节点广播该区块。区块有一个区块头(header)和一系列交易。每一个区块存储前一个区块的哈希值,由此创建一个相连的链。

    为了挖区块,矿工首先从收到的广播中收集新的、未挖出的交易,然后滤掉不合法的交易。

    合法的交易必须满足正确地使用私钥签名、账户有足够的余额进行交易等条件。现在矿工创建一个有区块头和内容的区块。

    内容(content)是区块包含的交易列表。

    区块头包含:

    • 前一个区块的哈希
    • 区块序号
    • 随机数(nonce)
    • 目标值(target):是一个256位的数字
    • 时间戳(timestamp)
    • 难度值(difficulty):是目标值的一种不同表述方法,目标
      值越低,发现随机数需要的时间越多;目标值越高,需要的时间越少。
    • 矿工地址(address)等内容。

    Tip:

    网络中的任何节点都可以检查区块链是否合法,首先检查交易在区块链中是否合法以及时间戳的验证情况,然后检查区块的目标值和随机 数是否合法、矿工是否得到合法的回报等。

    如果网络中的节点接收到两个不同的合法区块链,那么所有区块的整体难度值较高的那个区块链被视为合法的区块链。

    例如,假设网络中的一个节点想改变一个区块中的一些交易,就需要重新计算该块以及该块后面所有区块的随机数。可是在该节点计算的同时,网络其他节点已经又挖出了许多新的区块,因此当它重新计算到最新区块时会因整体难度值较低而被系统拒绝。可见,私自篡改账本的难度是非常大的。

    5 时间戳

    当一个矿工广播一个新挖出的区块时,其他节点对其时间戳的验证取决于其时间戳是否大于前一个区块的时间戳。

    如果一个矿工使用的时间戳大于当前时间戳,则难度值较低,因为难度值与当前时间戳成反比,因此网络将接受区块时间戳是当前时间戳的矿工,因为它的难度值比较高。

    如果一个矿工使用的时间戳大于前一个区块时间戳,且小于当前时间戳,难度值会高一些,因此要花费更多时间挖区块。

    6 随机数

    随机数是一个64位未签名证书。矿工不断地尝试随机数,直到发现目标值。

    每个矿工挖的区块的哈希是不同的,因为哈希取决于如时间戳、矿工地址等内容,而且对于所有矿工来说这些内容很可能是不一样的。因此,解决问题并不是一场比赛,而更像是一件碰运气的事。所以,矿工可能因为算力大而走运,但那并不意味着该矿工总会发现下一个区块。

    7 区块时间

    区块难度值公式使用了一个长达10s的阈值,以确保挖出父区块和子区块的时间差在10s和20s之间。

    无效块(stale block):在以太坊中,无效块称为“叔块(uncle block)。如果两个矿工用几乎相同的时间挖下一个区块,会发生什么呢?两个区块肯定都是合法的,但是区块链不能包含区块序号相同的两个区块,而且两个矿工都得不到回报。尽管这是个常见问题,解决方法却很简单,最后难度值较高的区块链将被网络接受。所以最后被忽略的合法区块叫作无效无效块。

    网络中生成的无效无效块总数与生成新区块所需的平均时间成反比。更短的区块生成时间意味着新挖出来的区块向整个网络广播的时间更短,矿工发现问题解决办法的概率更大,所以当区块向整个网络广播时,其他一些矿工可能也解决了问题并进行了广播,由此产生了无效块。但是如果生成区块的平均时间长一点,多个矿工能解决问题的概率 就小一点,而且即使它们都解决了问题,也很可能存在时间差,在这个时间差里,第一个被解决的区块就可以进行广播,另一个矿工就可以停止挖那个区块并继续挖下一个区块。

    在无效块上工作的网络是在无效块上挖下一个区块,结果是网络算力损失,因为算力用在了没有用的事情上。所以,在挖出下一个区块之后,难度值将降低,原因是用于挖区块的时间比平均时间更长。难度值降低会影响整体区块链安全。如果无效块率太高,将在很大程度上影响区块链安全。

    以太坊如何解决无效块?——ghost协议

    以太坊用ghost协议解决无效块带来的安全问题。ghost协议仅仅把无效块添加到母链上,掩盖了安全问题,由此增加了区块链的整体难度值,因为区块链的整体难度值还包括无效块的难度值之和。

    但是如何才能在不产生交易冲突的情况下把无效块添加到母链中呢?
    事实上,任何区块链都可以接纳零个或者多个无效块。为了激励矿工接纳无效块,矿工接纳无效块将得到回报。此外,发现无效块的矿工也将得到回报。无效块中的交易不用于计算确认,无效块矿工也不向无效块接纳的交易收取交易费。

    矿工接纳无效块得到的回报计算公式如下:

    这里写图片描述

    8 分叉

    • 普通分叉:普通分叉是由于两个或者多个矿工几乎同时发现了一个区块引起的暂时冲突。如果一个难度值高于另一个,冲突就解决了。

    更改源代码可能引起冲突。根据冲突类型,可能要求有50%以上算力的矿工升级,也可能要求所有矿工升级,以解决冲突。

    • 软分叉:要求有50%以上算力的矿工升级以解决冲突。如更新源代码使旧区块/交易的一部分失效,则有50%以上算力的矿工升级后可以解决。
    • 硬分叉:要求所有矿工升级以解决冲突。如更新源代码是为了更改对矿工的回报,则全部矿工需要升级以解决冲突。

    9 创世区块

    创世区块(genesis block)是区块链中的第一个区块,其区块序号是0。它是区块链中唯一一个不指向前一个区块的区块,因为没有前一个区块。它也不包含交易,因为还没产生任何以太币。

    只有网络中的两个节点有相同的创世区块,它们才会彼此配对,也就是说,如果两个对等节点有相同的创世区块才会进行同步区块,否则它们将彼此拒绝。

    每一个节点生成自己的创世区块。对于不同的网络,创世区块被硬编码到客户端里。

    10 以太坊虚拟机(EVM)

    EVM是以太坊智能合约字节码(byte-code)的执行环境,网络中的每个节点都运行EVM。所有节点执行使用EVM指向智能合约的全部交易,因此它们进行同样的计算,并存储同样的数值。

    每个节点执行并存储最终状态。如,如果有一个智能合约存储参加派对的每个人的姓名和细节,只要增加新的人,就向网络广播新的交易。网络中的任何节点想要展示参加派对的每个人的细节,只需读取合约的最终状态即可。

    每个交易需要在网络中进行一些计算和存储。因此需要有交易费, 否则整个网络里将充斥着垃圾交易,而且没有交易费用矿工就没有理由在区块中接纳交易,它们将开始挖空区块。

    11 gas

    gas(燃料)是计算资源的计量单位。

    每一个交易都需要包含gas上限。如果交易使用的gas少于或等于gas上限,交易继续进行。如果gas总数超过gas上限,则撤销所有修改,除了仍然合法且矿工仍然能够收到费用的交易。

    矿工决定gas价格。如果交易gas价格低于矿工决定的gas价格,矿工将拒绝挖交易。

    如果gas价格低于期望,矿工可以拒绝将交易接纳入区块。

    gas价格以wei为单位。

    EVM的每个操作都被分配了一个数字,用以表示它可以消耗的gas。

    交易成本影响一个账户可以转账给另一个账户的以太币上限。如,如果某个账户里共有5个以太币,它不能把全部5个以太币转入其他账户,因为如果把所有以太币都汇走,账户就没有余额支付交易费了。

    12 发现对等节点

    节点不需要连接到网络中的每一个节点;相反,它只连接到几个其他节点,这些节点再连接到另外几个节点。按照这个方式,整个网络彼此连接。

    节点如何发现网络中的一些其他节点?

    以太坊有自己的节点发现协议可用于解决这个问题,该协议以Kadelima协议为基础。在节点发现协议中有一种特殊的节点,叫作Bootstrap(初始启动)节点。Bootstrap节点保存了一段时间内与它们连接的所有节点的列表,但其本身不保存区块链。当对等节点连接到以太坊网络时,它们首先连接到Bootstrap节点,Bootstrap节点分享在刚才事先定义的时间里连接到它们的对等节点列表。然后对等节点与对等节点连接并同步。

    13 Whisper和Swarm

    Whisper是一个去中心化的通信协议,Swarm则是一个去中心化的文件系统。

    14 geth (go-ethereum)

    geth是以太坊、Whisper和Swarm节点的一个实现。合并它们的目的是让它们看起来像单一的DApp,通过一个节点客户端就可以访问三个DApp。

    geth是一种CLI应用,它用Go语言编写。

    14.1 安装geth

    • OS X :推荐在OS X中使用brew安装geth。在终端运行下面两个命令安装geth:
    brew tap ethereum/ethereum
    brew install ethereum

    14.2 JSON-RPC和JavaScript操作台

    geth为其他应用提供了与其进行通信的JSON-RPC API。geth使用 HTTP、WebSocket和其他协议服务于JSON-RPC API。

    geth还提供了一个交互JavaScript操作台,可以使用JavaScript API进行程序交互。该交互操作台使用JSON-RPC与geth进行通信。

    14.3 geth的子命令和选项

    • 连接至主网网络:

    以太坊网络中的节点默认用30303端口通信。但是节点还可以收听一些端口。

    为了连接到主网网络,只需要运行geth命令即可。例如:

    geth --datadir "/users/packt/ethereum" --networkid 1

    其中,–datadir选项用于指定在哪里存储区块链。如果没有提供, 默认路径是“$HOME/.ethereum”;

    –networkid用于指定网络ID。1代表主网网络ID。如果没提供网络ID,默认值是1。2代表测试网络ID。

    • 创建私有网络:

    要创建私有网络,只需给出一个随机网络ID即可。通常创建私有网络的目的是进行开发。可以简单使用–dev标记运行一个私有网络,该网络允许多个与日志和调试相关的标记,而不用给出一个随机网络ID并放上多个与日志和调试相关的标记。

    14.4 创建账户

    • geth还允许创建账户,即生成密钥和相关地址。
    geth account new

    当运行上述命令时,需要输入密码以加密账户。如果忘记密码,就无法访问账户了。

    • 在本地钱包获得所有账户的列表
    geth account list

    密钥默认存储在–datadir路径中,但用户可以使用–keystore选项指定一个不同的目录。

    1.挖矿

    默认geth不启动挖矿。为了指示geth开始挖矿,只需要提供–mine选项。

    这里写图片描述

    • –minerthreads选项用于指定哈希过程中使用的线程总数,默认使用8个线程。

    • etherbase是挖矿赚取的回报存入的地址。

    • -unlock可以使用-unlock选项解锁一个或者多个账户。使用逗号分隔地址可以提供多个地址

    • –minergpus用于指定挖矿使用的GPU。为了得到GPU列表,可以使
      用geth gpuinfo命令。每个GPU需要1~2GB的RAM。默认只使用CPU。

    2.快速同步

    快速同步(fast synchronization)不下载整个区块,而只下载区块头、交易凭证和最新的状态数据库。

    因此用户不需要下载和重播全部交易。为了检查区块链的真实性,该算法在每一个已定义的区块序号之后下载一个完整的区块。

    为了在下载区块链过程中使用fast sync,用户需要在运行geth的过程中使用--fast

    出于安全原因,fast sync只在初始同步时运行(即该节点自身的区块链为空时)。在节点成功与网络同步后,fast sync就永远禁用了。

    15 以太坊钱包

    以太坊钱包允许用户进行创建账户、发送以太币、部署合约、调用合约方法等操作。以太坊钱包与geth捆绑在一起。运行以太坊时,它会尝试发现一个本地geth实例并与之连接。如果它不能发现geth正在运行,它就启动自己的geth节点。

    16 浏览器钱包(Mist)

    浏览器钱包(Mist)是以太坊、Whisper和Swarm的一个客户端,它允许用户发送交易、发送Whisper信息、检查区块链等。

    目前,浏览器中运行的前端JavaScript可以使用web3.js库(该库为其他应用提供以太坊操作台的JavaScript API与geth通信)访问geth节点的web3 API。

    Mist的基本思想是创建第三代Web(Web 3.0),即使用以太坊、Whisper和Swarm替代中心化服务器端,这样就不需要服务器端了。

    17 以太坊的缺点

    • Sybil攻击:攻击者可能试图用他控制的普通节点占满整个网络,那么用户很有可能只连接到攻击者节点。一旦连接到攻击者节点,攻击者可以拒绝从所有节点转播区块和交易,从而将用户从网络中断开。攻击者只能转播他创建的区块,从而会将用户放到分开的网络上。
    • 51%攻击:如果攻击者掌握了网络中一半以上的算力,他就可以比网络中其他人更快地生成区块。拥有50%以上的算力,矿工就可以重写交易,阻止全部/一些交易被挖出,并阻止其他矿工挖出的区块被添加到区块链中。

    这里写图片描述

    展开全文
  • 以太坊:Truffle开发入门

    千次阅读 2019-04-09 00:58:24
    而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只搭建环境,运行第一个区块链程序(Dapp)。 安装truffle $ npm...

    以太坊是区块链开发领域最好的编程平台,而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只搭建环境,运行第一个区块链程序(Dapp)。

    安装truffle

    $ npm install -g truffle

    依赖环境 NodeJS 访问https://nodejs.org 官方网站下载安装

    系统:Windows, Linux or Mac OS X,推荐Mac OS X,不建议使用Windows,会碰到各种各样的问题,导致放弃。

    需要安装Ethereum客户端,来支持JSON RPC API调用 开发环境,推荐使用EthereumJS TestRPC: https://github.com/ethereumjs/testrpc

    安装命令: $ npm install -g ethereumjs-testrpc

    新建第一个项目

    $ mkdir zhaoxi

    $ cd zhaoxi

    $ truffle init

    默认会生成一个MetaCoin的demo,可以从这个demo中学习truffle的架构

    项目目录结构如图:

    项目所有文件目录如图:

    编译项目

    $ truffle compile 

    部署项目

    部署之前先启动TestRPC

    $ testrpc

    $ truffle deploy(在Truffle 2.0以上版本中,命令变成了:truffle migrate) $ truffle migrate 执行结果 

    启动服务

    $ truffle serve 

    启动服务后,可以在浏览器访问项目: http://localhost:8080/ ,网页界面如下:

    好了,第一个区块链程序跑起来了,后面可以不断地实践深入学习了。有问题欢迎联系我交流。

    展开全文
  • 一个dapp开发者有一组用Solidity编写的合约,开发者将这些合约编译成Arbitrum虚拟机(VM),在Arbitrum Rollup上运行。你希望它们能快速运行。 Rollup的基础知识 让我们从基础知识开始。你的虚拟机的状态被组织成一...
  • 一个dapp开发者有一组用Solidity编写的合约,开发者将这些合约编译成Arbitrum虚拟机(VM),在Arbitrum Rollup上运行。你希望它们能快速运行。Rollup的基础知识让我们从基础知识开始。你的虚拟机的状态被组织成一个...
  • 简单理解以太坊智能合约

    千次阅读 2018-04-13 21:14:54
    前言Eth(以太坊)不知道你有没有听说过,ICO你一定听说过。但你知道ICO其实是借助Eth的智能合约实现的吗?什么是智能合约,Eth为啥这么火?智能合约的特点是什么,我怎么写智能合约?基于智能合约还有Dapp,即分布式...
  • Eth(以太坊)不知道你有没有听说过,ICO你一定听说过。但你知道ICO其实是借助Eth的智能合约实现的吗?什么是智能合约,Eth为啥这么火?智能合约的特点是什么,我怎么写智能合约?基于智能合约还有Dapp,即分布式app...
  • 前言Eth(以太坊)不知道你有没有听说过,ICO你一定听说过。但你知道ICO其实是借助Eth的智能合约实现的吗?什么是智能合约,Eth为啥这么火?智能合约的特点是什么,我怎么写智能合约?基于智能合约还有Dapp,即分布式...
  • 了解以太坊的基本逻辑,理解以太坊运行机理。能正确进行DAPP设计开发和部署。 基本原理 了解DAPP设计开发和部署。熟悉工具安装。 实验环境 使用VMWare中的Ubuntu虚拟机进行实验。 参考教程:...
  • Embark 以太坊Dapp开发框架,支持IPFS、Whisper及Orbit调用 Web3Swift 一个Web3的swift SDK Porosity 反编译以太坊智能合约工具 Solidity-Coverage 检测Solidity代码覆盖 Caliper hyperledger区块链性能测试工具...
  • 既了解区块链底层原理、又熟悉以太坊架构、还能基于以太坊开发DApp的专业人才,也成为了各大公司发力区块链技术储备的重点对象。 01.Go语言核心技术 性能卓越的Go语言已被全球知名公司谷歌、亚马逊、阿里、京东等...
  • 而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只搭建环境,运行第一个区块链程序(Dapp)。 安装truffle $ npm ...
  • 而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只搭建环境,运行第一个区块链程序(Dapp)。安装truffle$ npm install...
  • 区块链入门技术之Truffle

    千次阅读 2016-11-18 17:12:04
    而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只搭建环境,运行第一个区块链程序(Dapp)。 安装truffle $ ...
  • 而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只搭建环境,运行第一个区块链程序(Dapp)。安装truffle$ npm install...
  • 而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只搭建环境,运行第一个区块链程序(Dapp)。 安装truffle $ ...
  • Truffle开发入门

    2018-04-17 00:29:52
    而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只搭建环境,运行第一个区块链程序(Dapp)。 安装truffle $ npm...
  • 和笔记内容(2)

    2020-08-12 21:28:14
    学习以太坊,让我们学会怎么运用智能合约和DAPP; 学习EOS,让我们把区块链应用到各行各业 EOS使用WebAssembly(WASM)执行用户生成的应用程序和代码,WebAssembly的作用就是:让C/C++代码在浏览器中运行。 nodeos:...
  • 第3课 以太坊网络 第4课 智能合约编程入门 第5课 Solitidy复杂变量类型 第6课 Solitidy 方法 第7课 Solitidy 继承 和 事件 第8课 Solitidy 编程实战 第9课 Solitidy 编程实战 第10课 去中心化应用Dapp项目实战

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

以太坊dapp运行原理