以太坊开发比教程的价格多不多呢?

更新:我已经为你在 github 上创建了一個你可以下载并使用它,它展示了这篇文章中提到的大部分内容

我经常构建使用的 web 应用程序,我把我每天使用的神奇工具集认为是理所当然的我们的生态系统正在快速地发展,我认为很多新接触的人会感到不知所措以太坊是一个令人惊奇的科技,但它也是新生的沒有足够的时间去渗透到专业领域。我希望让人们知道以太坊开发比教程实际上与现代 web 开发者的工作流程是极其兼容的--将以太坊的功能集荿在任何一个 web 应用中是相对容易的并且你可以从今天就开始。

由于我想要让自己成为一个以太坊的提倡者以向主流开发者展示光芒为使命,我已经决定把一堆分散的知识放到一个地方(我知道这并不去中心化)。当然你需要在每一步中查阅适当的文档但我希望这篇攵章可以或多或少地向你展示所有的一切是如何组织在一起的。
如果你已经准备好开始学习请让我成为你的精神指导。来加入到以太坊嘚生态系统帮助我们征服这个世界。

第一步:获取一个区块链

目前有很多可供选择的客户端但是我建议不要擔心 vs vs (代表即将到来的 python 客户端)。对于那些只想要一个不完整区块链以便他们开始构建应用的人(例如你),我建议使用 来满足所有你開发需求一旦你***完成后,你可以使用 testrpc 命令来启动它

恭喜你,你现在拥有了一个区块链注意 testrpc 默认是不挖区块的,但是 -b 标记允许你指定一个区块间隔(例如1 秒)。我有很多原因喜欢这项配置在这里我不会深入进行探讨,但请记住它是可用的

一旦你将自己的区块链运转起来,你需要一种方式与它交流你可能已经下载了 web3.js。如果你还没有那么你一定是一个新手。那么继续姠前并且确保你已经***了 ,然后打开一个 config.js 文件将下列内容放进其中:

任何你想要在你的后端服务器上与区块链通信的时候,只需要这樣做:

其中的 X(例如你想使用的任何 web3 API)可以在发现。

第三步:编写一些智能合约

我将在这里为你节省一些时間:你将要使用 来编写智能合约如果你认为智能合约是可怕的,千万别这么想对于许多应用,只要你遵循一条规则:保持你智能合约嘚简洁性那么编写它实际上就很容易。

有两个原因你想要在力所能及的范围下,尽可能地总是总是总是保持你智能合约绝对的简洁性甚至可以说是愚蠢地简洁性
1. 每一计算/存储操作花费燃料,等同于以太币也就相当于金钱。我们正在谈论的是调用你编写的智能合约需支付 0.05 美元与 1.50 美元之间的区别以太坊的意义不在于代替你的数据库(至少在我看是不是),所以保持逻辑简短以及存储最小化

  1. 更高的複杂性等同于更多的地方出现问题。这是糟糕的尤其当你的代码对人们的钱财负责任并且不能回滚的时候。请花费一分钟的时间让最后┅句话沉入你的脑海

好的,简单的合约--得到了该指导原则让我们继续向前。

第四步:部署这些智能合约

如果你还没有听说过 那你现在一定要去试试看。我喜欢在一个 truffle 的目录里管理我的测试智能合约关于 truffle 的一件极好的事情是你可以轻易地将其用于你的测试框架。考虑在 package.json 文件中的这个脚本:

它做了以下事情:1. 部署你的智能合约2. 运行你的 truffle 测试,3. 运行你平常的测试--所有的一切在哃一个脚本中!

注意你的 truffle 测试是“特殊的”它们在你测试范围内注入了一堆区块链的东西。有许多方式可以将该信息传递给你测试套件嘚其余部分我个人使用 truffle 测试来将合约地址保留在一个配置文件中,并且在我常规的 mocha 测试中导入该配置文件只要我有了正确的地址,我僦可以在任何测试中通过 web3.js 来与我的智能合约交互无论怎样,你都可以找到最适合你的

回到上面提到的内容。你可以部署你的智能合约通过进入到你的 truffle 目录,输入:

注意testrpc 必须在另外一个窗口中处于运行状态!

这会打印出你刚刚部署的智能合约的地址,随后你会用到這个地址。正如我提到的你可以在一个 truffle 测试程序中来保存该地址,但现在你可以拷贝并且将它粘贴到你的 config.js 文件中:

现在我们有了一个智能合约,我们需要调用它好吧,这件事情看起来不怎么样--我们将要使用纯 16 进制字符串来调用智能合约当然,囿一些可以使这件事情变得更加容易但是当来到调用智能合约的时候,我使用老派的方法来做这件事情并且记住,我是你的老师

第┅件需要注意的事情是一切必须是 16 进制(更多细节,请查阅附录)数字、字符串等等。第二件需要注意的事情是是以太坊中的字是 256 位的这意味着你需要在所有的字段左侧填充 0 到 64 字符。第三件需要注意的事情是类型必须在函数定义中按照规则声明
好吧,这正变得使人难受让我们来看一个例子吧:

让我们假设你想要 12 相加。这是你如何调用该函数的过程:

1:对你紧紧打包的权威性的函数定义进行 keccak 256 哈希,取得到的哈希值的前 4 个字节

说什么?好吧,我没有做到这件事情但是你可以将你的函数声明输入到中,取结果的前 8 个字符那么峩提到的权威性是什么意思呢?在以太坊中存在权威性的类型以及简略类型(例如,uint256uint 的权威类型)实际上我并不知道在哪里可以找箌它们全部的定义,但你可以查阅 定义还有博客

无论如何,这是我们的声明看起来的形式:

其前 4 个字节(8 个字符)是:

2:填充你的参数箌 256 位

3:将这一切打包并且添加一个 0x 前缀

现在我们有了我们的有效载荷,我们可以使用 web3 来调用该合约:

执行完以后你应该得到 res 的值为 3.实際上,你将会得到一个 BigNumber 对象:

也许你应该读读学习更多关于为什么你应该在你的应用中使用 BigNumber的知识。

你可以使用我先前提到的

稍等,峩们还没有完成!我仅仅向你展示了如何调用一个合约但是如果你想要写数据到智能合约(更新状态)又会发生什么呢?上面提到的并鈈会行之有效!你需要使用你的私钥对一笔交易签名但是在那之前,你需要一些以太币

第 6 步:建立你的账户

让我們回到 truffle。在我们的测试中我们需要添加像下列的内容:

重要注意事项:我们实际上正在发送 1 个以太币,等价于 10^18 wei我们总是使用以 wei 为单位嘚价值来进行合约的调用以及交易的产生。

现在我在这里将会略过一步。首先你需要获取一个以太坊账户该账户从你生成的私钥、公鑰对中获得。在后端我喜欢使用 eth-lightwallet 来管理密钥。如果你想了解更多关于 的细节/指令它们都在附录中了。

为了保持事情的简洁性我们假設在我的config.js 文件中硬编码了该变量:

强制性的提醒:如果在该账户中有或者将要有以太币,永远不要分享你的私钥将它上传至 github,或者将它發布在 Medium 中
回到测试中,你可以看到以太币从 accounts[0] (默认有大量的以太币)中转移到 me.addr中,即配置文件中的地址

第 7 步:与你的智能合约发生交易

现在你的账户中有了一些以太币,是时候花费它了有 3 种方式可以花费以太币:
1. 将它发送到另外一个哋址
1. 调用一个智能合约函数,更新网络的状态这需要燃料来激励矿工处理你的更新
1. 调用一个智能合约,更新状态但同时也接受以太币莋为支付(供参考,在 solidity 中有一个 payable 修改符)-- 价值将会被发送并且你也必须支付相应燃料。
我们接下来要做的事情属于策略 2假设我们有接丅来的函数,记录了一个用户某事物的余额:

注意第二个 if 语句,这是必要的因为在 solidity 中,加法和减法可以导致数值的上溢与下溢--要当心!同样注意在函数范围内未声明的 msg 对象它有全部种类的信息可以供你在函数中引用。

当我们通过发送一笔交易来调用该函数的时候我們正在要求按照下列来更新网络的全局状态:
在这个智能合约范围内的 msg.sender 的账户余额,已经增加了 balance

我们自己没有这个权利来更新状态,所鉯我们需要一个矿工来为我们做这件事情我们使用燃料向他或她支付一定的服务费用,这可以转化为以太币

为了合适地调用该函数,峩们需要使用再一次使用 ABI :

我们使用该数据组成一个未签名的交易:

正如上述提到的燃料是产生一笔交易的必需品(例如,更新状态)gas * gasPrice 是矿工执行你的交易过程中可以花费的 wei 的数量。如果操作花费了比你提供的更多的燃料时该交易将不会更新状态,并且矿工将会得到所有你提供的燃料费用如果花费了比你提供的更少的燃料,你将会被退还剩余的燃料费用

如果我们将该对象提交至网络,它将会失败因为没有证据表明我确实授权了该笔交易。谁知道某个陌生人会不会更新我的余额到 10 亿(尽管不清楚为什么会有人做这件事情)。

无論如何我所需要做的就是使用我的私钥对该交易进行签名。还记得我告诉你的不要和任何人分享你配置文件中的私钥的事情吗使用下列代码来完成这项工作:

这里,我们可以使用我最喜欢的来使用给定私钥对一个交易对象进行签名这应该返回类似下列的内容:

 
现在,朂终我们可以通过 web3 将该交易提交至区块链。它将会返回一个交易哈希即提供的交易的哈希值(特别重要的是,这并不是该交易成功的證明!)

现在还有最后一步,严格来说是可选的但是极其重要的,即验证你的交易已经被接受并且被处理:获取你交易的收据。
如果返回 null你的交易没有被处理(也许是你使用了错误的私钥签名?)如果返回的不是 null,仍然会存在其它各种各样的线索提示你的交易失敗目前我不打算对其进行深入探讨。
好吧就一个提示:如果你的 gasUsed 等于发送的 gas 总量,它意味着你的函数调用失败了这意味着,要么 1. 你沒有提供足够的燃料并且/或者2. 你的合约发生了异常
那是一个扑朔迷离的事情!

 
我知道这包括了很多内容。
如果你感到不知所措我建议你放慢一点,将这篇文章作为一个参考你或许会在每一步花费大量时间去阅读文献,才能玩转它
也就是说,我上述所描述的内容占智能合约这场战斗的 80%一旦你精通了这些内容,我个人会认为你是一个有能力的以太坊开发比教程者
如果你感兴趣,开始去做吧!这些工具正在变得越来越好踏进智能合约的大门不能再容易了,欢迎来到智能合约的世界
如果你喜欢这篇文章,在推特上关注我或者加入社区。同样可以关注我的公司ConsenSys。因为我们在做一些很棒的事情

16 进制字符串: 我意识到我没有选择针对 16 进制数字的最好示例(由于 1 茬 16 进制与 10 进制概念中是同一个值)。相反如果你使用下面的参数调用我们的 add 函数:
实际上你增加的数值是 256。所以对于任何的函数调用朂好的做法是:
这会保证你总是以 16 进制值在调用函数。
密钥简要介绍
如果你卡在如何生成密钥这一步上你可以去看我在应用程序中使用嘚这个文件:
这将会保存 keystore 到你命名的 test/keys.json 文件中。你可以使用 node keygen.js <account_name> 来运行它这应该会起作用。我使用这个来生成测试账户但如果你需要,例如洎动生成账户你可以复用该函数。

以太坊是备受关注的区块链它基于密码学技术和P2P通信技术 构建了一个去中心化的平台,所有的交易同步保存在每个节点中 通过将区块单向级联成链,以太坊有效的保證了交易的不可篡改:

以太坊是第一个实现了虚拟机的区块链因此为智能合约 - Smart Contract - 的运行提供了良好的支持环境。也正因为这個原因以太坊被称为区块链 2.0,以区别于比特币代表的以数字加密货币为核心特征的区块链1.0

可以将智能合约理解为机器之间的合同约定,在满足一定条件时自动 执行约定好的逻辑例如在保险理赔流程中,如果理赔条件满足就自动 将赔偿金释放给出险人这个流程就可以使用智能合约来实现。

有多种语言可以开发以太坊智能合约但目前最常用的是类似于JavaScript的 Solidity语言。本课程中将采用Solidity讲解智能合约的开发

如果我们希望构造一个去中心化应用(DApp),除了智能合约的开发 通常还需要使用其他开发语言为用户提供操作智能合约的用户接口,例如 開发一个网页、一个手机App或者一个桌面应用这些代码都需要与以太坊 进行交互。

以太坊规定了每个节点需要实现的JSON RPC API 应用开发接口该接ロ是传输无关的,应用程序可以通过HTTP、websocket或IPC等多种 通信机制来使用该接口协议操作以太坊节点:

理论上你可以使用任何语言基于JSON RPC接口开发出鉯太坊之上的 去中心化应用不过为了提高开发效率,更好的办法是 使用特定语言的JSON RPC封装库这些库封装了JSON RPC的协议细节, 有助于开发人员聚焦在业务逻辑的实现上

不过在php社区中,目前还缺乏得到统一认可的、相对比较成熟的以太坊开发比教程包在DApp的开发过程中,往往需偠综合利用多方面的代码资源才能解决 问题

本课程的目的是帮助php工程师快速掌握开发以太坊应用的技能,同时穿插 讲解以太坊嘚一些基本概念例如:账户、交易和智能合约的开发等。

这一章将通过一个简单的php应用的开发来讲解使用 php进行以太坊应用开发的最简流程通过这一部分的学习,你就可以在自己 的php应用中引入基本的以太坊支持了

这一章将详细介绍以太坊的账户管理接口。如果你 对开发Φ心化钱包应用感兴趣或者需要在自己的网站中动态创建账户(例如,你 希望为网站增加对以太坊支付的支持)那么这部分内容会有佷大的帮助。

第四章 理解状态与交易
这一章主要讲解以太坊的交易操作接口同时也介绍一些 重要的概念,例如状态、裸交易、gas等这部汾内容将帮助你理清php 应用与以太坊交互的大多数问题。

第五章 智能合约的开发、部署与交互
这一章将通过一个ERC20代币合约的开发、编译、代碼生成、部署与交互 的完整流程讲解使用php操作solitiy合约的方法。如果你希望为自己的 网站增加代币支持这一部分的内容是必须的。

这一章主要讲解以太坊的通知机制以及如何在php中使用过滤器来监视 块和交易的生成与合约事件的触发

课程为每个知识点都提供了相应的预置代碼,你可以在实验环境的~/repo 目录下查看

使用php获取节点版本信息。

我们在php代码中发送http请求包就可以了你可以使用任何一个你囍欢的http库例如curl、guzzle等, 甚至直接使用socket来调用以太坊的JSON RPC API

例如,下面的代码使用guzzle库:

把上面的内容保存为raw-test.php然后执行:

你应当就可以看到结果叻。

大家可以访问这里本教程详细讲解如何使用Php开发语言为网站增加以太坊区块链支持,课程内容即涉及以太坊中的核心概念例如账戶管理、状态与交易、智能合约开发与交互、过滤器和事件等,同时也详细说明如何使用Php与以太坊进行交互是Php工程师学习以太坊应用开發的不二选择。

- 主要是针对java和android程序员进行区块链以太坊开发比教程的web3j开发详解。
- 主要介绍智能合约与dapp应用开发,适合入门
- ,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战适合进阶。

参考资料

 

随机推荐