主页 > imtoken钱包官方版下载 > 以太坊开发完整介绍《小白必看》

以太坊开发完整介绍《小白必看》

imtoken钱包官方版下载 2023-01-18 18:04:03

以太坊

Ethereum,以太坊是一个有很多节点的分布式计算机,每个节点执行字节码(实际上是智能合约),然后将结果存储在区块链上。 由于整个网络是分布式的,而应用是由状态一个一个组成的,状态存储后服务可用; 所以它永远停不下来,没有中心化节点(没有一个节点说了算,去Centralized),任何第三方都无法介入。

显然,上面这段话直接说明了什么是以太坊。 但是你可能有很多问题。 你可以先阅读以太坊白皮书。 或观看此视频以在 25 分钟内了解以太坊。 (译者注:以太坊入门真的没有什么好方法,最好最快的方法就是看白皮书)

以太坊开发指南

智能合约

智能合约其实和普通代码没什么区别,只是运行在以太坊这样的分布式平台上。 这个运行平台赋予这些代码不可变的、确定性的、分布式的和自我验证的状态。 代码执行期间的状态存储是不可变的。 每个人都可以打开自己的节点,重放整个区块链,得到相同的结果(译者注:就是所谓的共识,可以控制所有节点达到一致的状态)。

在以太坊中,每个合约都有一个唯一的地址来标识自己(源自创建者的哈希地址和曾经发送的交易数量)。 客户端可以与这个地址交互,发送以太币,调用函数,查询当前状态等。

智能合约本质上是一段代码,代码运行后存储在区块链上的状态。 例如,你用来发送和接收 ETH 的钱包本质上是一个在外部有接口的智能合约。

这个概念非常强大以太坊浏览器下载,我相信你已经看到了。 而当你在看相关新闻的时候,你经常会听到这个有很大的潜力,你经常会听到资产/权利管理、去中心化自治组织(DAO)、身份、社交网络等等很酷。 但这就是他。

气体

智能合约是在整个分布式网络中运行的代码。 由于网络中的每个节点都是一个完整节点。 这样做的优点是容错性强,缺点是效率低,耗费资源和时间。 因为执行计算是要花钱的,而要执行的操作量与代码直接相关。 因此,在网络上运行的每个底层操作都需要一定量的气体。 Gas只是一个名字,代表执行的成本(译者注:由于以太坊是图灵完备的,任何死循环都会导致网络不可用,所以引入了gas的概念)。 在整个分布式网络中引入强制限制以避免停机问题。 所以如果你写一个无限循环,当gas耗尽时,网络会拒绝执行下一个操作,并回滚你之前的所有操作。

gas的价格由市场决定,类似于比特币的交易手续费机制。 如果你的gas price高,节点会因为利息问题优先打包你的交易。

一般来说,在以太坊中计算和存储东西比在传统环境中进行计算和存储更昂贵,但是,以太坊为您的代码提供了我们上面讨论的那些不错的属性,这些属性可能同样有价值。

一般来说,在以太坊网络上读取状态是免费的,只有写入状态是收费的。 下面这篇文章是对gas这个概念的一些深入分析。

分布式应用程序 (ĐApp / Dapp / dapp / dApp)

分布式应用程序是指在服务器端运行在以太坊网络上的一个或多个智能合约。

一个分布式 App 不需要把所有的状态都存储在区块链上,或者在链上进行所有的计算(译者注:比如图形渲染),这样会消耗 gas 太贵了。 所以分布式应用程序应该将每个人都信任的状态存储在区块链上。 很多分布式应用使用后文提到的技术,如IPFS、Gelem,在链下进行分布式存储和计算。 虽然不在以太坊上,但它仍然使用区块链技术。

不知道是谁开始用D的这个小缺点,看起来很酷,但是很影响搜索。 你可以随意使用,但尽量让别人方便搜索。

在以太坊的 github 上,有一个 dapp-bin 目录,里面有一些文档和例子。 在使用之前,您需要查看文件的最近状态,因为它们很可能已经被淘汰了。

DApp 客户端

大多数分布式应用程序都是通过一些用户友好的前端服务的,因为不是每个人都愿意使用命令行手动组装哈希字符串和操作指令代码来进行交易。

DApp 类似于传统的开发客户端或前端,唯一的区别是它们与以太坊区块链交互(同时也可以与其他服务交互)。 这些客户端往往是用 JS 写的,因为到 NodeJS 的转换还没有完成。

另外,大部分Dapp客户端之所以使用JS,是因为它可以在浏览器中运行,因为每个人都有浏览器,所以每个人都可以运行它。 由于go语言的开发工具比较多,所以用go语言写的客户端也很多。 在这个密集发展的时期,这意味着,除非你有偏好,否则你可能不得不从 go 和 JS(也许还有 Rust)中选择一种语言来与以太坊区块链和基于以太坊开发的协议进行通信互动过。

以太坊的一位核心开发者写了一篇关于使用Meteor工具创建Dapps的文章,这意味着Meteor已经成为Dapp客户端开发的新标准。 在构建基于 JS 的全栈应用程序时,这绝对是一种首选方法。 但需要注意的是,Meteor只是提供了一个开发工具,并不等同于DApp客户端,DApp客户端也可以通过其他方式进行开发。 (译者注:还有一些其他的开发工具,比如Truffle,也很不错)。

由于围绕 Meteor 和 DApps 的积极发展,Atmophere(Meteor 的包管理工具)中有很多包,它提供了很多常用的操作,比如账户管理,从区块链中获取最新的 50 个区块等。

DApp 浏览器

DApp 浏览器,顾名思义,就是用来方便使用 DApp 客户端(通常使用 JS 与以太坊智能合约进行交互)。

DApp 浏览器的主要目的是:

1.提供与以太坊节点的连接(或连接本地节点或远程节点),以及不同节点(甚至不同网络)之间的便捷切换。

2. 提供账户(或钱包)方便用户与DApp交互。

Mist 是以太坊的官方 DApp 浏览器。 一个漂亮的界面,可以与以太坊节点交互,通过智能合约发送和接收交易。

Status是一款可以在手机上使用的DApp浏览器。

MetaMask 是一个谷歌浏览器扩展,可以将 Chrome 变成 DApp 浏览器。 其核心功能是在各个接口中注入以太坊提供的js客户端库web3,让DApp连接到MetaMask提供的以太坊节点服务。 但是这个 Chrome 扩展允许你管理你的钱包并连接到不同的以太坊网络(译者注:包括本地开发网络)。

Parity 是一个以太坊客户端(也是一个全节点实现),它集成到网络浏览器中并使其成为 DApp 浏览器。

以太坊节点

类似于比特币的节点。 每个节点存储整个区块链的数据并重放所有交易以验证结果状态。 可以用geth运行全节点(官方节点,go语言),也可以用parity运行轻节点,是第三方的,用Rust语言写的。

您的节点需要知道从哪个区块链下载数据,以及要与哪些节点交互,一些常见的网络将在后面解释。

您可能能够运行所有这些节点客户端。 如果您不想自己运行这样的节点,您可以选择第三方网关服务,例如 Infura。 此外,还有本地版本的节点专门用于测试和开发,后面会提到。

如果你正在开发 DApp 客户端,你并不总是需要主动提供一个节点来连接以太坊。 因为DApp浏览器一般都会提供相应的连接(译者注:也就是说,要使用这个,就得额外安装一个DApp浏览器)。

以太坊代币

现在你应该知道我们可以编写智能合约并将状态存储在区块链上了吧? 那么如果在status部分,我们存储一个Map类型,key是一个地址,value是一个整数。 那么我们把这些整数值称为balances,到底是谁的balance呢? 就是我们说的token(译者注:token的数据结构就这么简单,存储的是一个用户,它的当前余额)。

是的,你刚才听到的所有代币只是一些数据,存储在哈希表中,通过API或所谓的协议进行添加、删除、修改和检查。 这是一个简单的基本合同。

你可以看看以太坊官方关于创建众筹合约的教程。 你会发现它只是一个合约(Crowdsale)与另一个合约(MyToken)交互,类似于之前的基础合约。 这没什么神奇的。

人们使用代币来做各种各样的事情,唯一阻碍你如何使用它们的是你的想象力。 代币通常用于激励用户与协议交互,或证明资产所有权、投票权等。Coinbase 的 Fred 有一篇关于代币、它们为何存在以及它们如何使用的精彩文章。

以太坊的创始人 Vitalik 最近有一篇关于代币销售模型的好文章。

ERC20 代币和 ERC23 代币

每个人都开始定义自己的与代币交互的协议,但这些协议很快就过时了,因此一些人开始聚在一起创建 ERC20 代币接口标准。 大致意思就是我们定义这些接口,让大家可以统一调用。 比如转账定义为transfer,第一个参数是要转账的账户地址_to,第二个参数是要发送的ether的uint_value个数。

有人觉得ERC20协议太复杂,于是提出了ERC197,简单一点。

由于 ERC20 的一个小故障,提出了一个新的 ERC23。 ERC23 向后兼容 ERC20。 如果你已经创建了代币合约,你可以尝试支持 ERC23。

ERC223和ERC23好像是同一个概念; ERC的值是223,但是在引用的时候,作者和其他人都误写了很多次ERC23,现在还是这样引用。 如果一句话说清楚,ERC223就是标准号,token描述就叫ERC23 token。

协议代币和应用代币

协议令牌用于激励协议的使用。 例如,Augur 的声誉令牌 REP 用于鼓励使用 Augur 的去中心化预测协议。 以太坊的ERC20/ERC23代币大部分是协议代币,比如Golem的GNT、ICONOMI、BAT等。

应用货币用于激励特定 DApp 或客户端的使用,而不是因为它使用的协议提供的价值。 这方面的一个例子是 Status 的 SNT 令牌,它可用于在应用程序内获得价值(例如,推送通知、投票权、获取用户名等)。

这种范式转变是我们可以开始投资协议代币而不是应用程序代币,因为我们可以在它们之上构建(任何人都可以在协议之上构建 dapp,或者为实现协议的 dapp 构建 Dapp 客户端)。

以前,这是不可能的,因为加密代币,协议创新的下一个时代,为了实现货币化,你可以自己在协议之上创建一个应用程序,实现盈利。 因为您可以自己将协议货币化,所以每个人都可以在未来更好地协作。

您或许可以阅读以下关于 0xProject 的文章,详细了解两者之间的区别。

与智能合约交互

您与智能合约的交互(也称为调用函数和读取状态)是通过连接到以太坊节点并执行操作码来实现的。 目前有多种以太坊客户端可以促进开发。 Geth 和 parity 都提供了一种控制台或浏览器方式来更好地与智能合约进行交互。

如果你想要一个程序库用来与智能合约交互的接口,那么也有客户端实现。 对于JS语言,可以使用web3.js。 在go语言中,可以使用go-ethereum中的abigen程序,它提供了一个go包,用于与智能合约进行交互。

如果仅用于测试和开发,可以使用ethereumjs-testrpc运行一个本地节点(译者注:该节点缩短出块时间等,可以方便整体的开发和测试)。

当你部署一个智能合约时,你实际上做的是向地址 0x0 发送一个交易,使用当前合约内容作为参数,以太坊交易的详细解释。

松露和登船

一旦开始编写智能合约,就会重复很多操作,比如将源代码编译成字节码和abi、部署到网络、测试和部署合约等等。 您可能希望更多地关注您想要实现的目标。

Truffle 和 Embark 框架标准化并自动化了这些琐碎的任务。 它们为开发、部署以及更重要的是测试智能合约提供了良好的体验。

您可以查看这篇文章,开始您的 Truffle 之旅。

本文提供了有关使用 Truffle 部署智能合约并与之交互的文章。

Embark 提供类似但略有不同的工具来帮助开发人员组织他们的项目。

当你开始使用智能合约时,你应该尽量不要使用框架。 在了解框架可以带来的价值之前,您不应该开始使用框架,就像您不应该通过 rails new 学习 HTML 语言一样。

乙醇胺

分享就是关怀,ETHPM是一个去中心化的智能合约包管理资源库。 使用ETHPM,您可以关联或连接知名合约或库,减少代码重复,尽可能理想地为以后的开发打下良好的基础。

此处的规范详细解释了相关信息和背景。 Truffle 和 Embark 都可以与之集成,创造愉快的开发体验。

互联网

主网 - 以太坊主网以太坊浏览器下载,通常是所有客户端的默认网络。

Ropsten - 以太坊使用工作量证明的主要测试网。 由于计算负载低,该网络容易受到 DDOS 攻击、碎片或其他问题。 它在垃圾邮件攻击后被暂时废弃,直到最近才恢复。

由Kovan-parity客户端组成的测试网络使用授权证明来提高对垃圾邮件攻击的免疫力,并持续4秒的阻塞时间。

由 Rinkeby-geth 客户端组成的测试网络,使用群体共识,尽管计算量低,但对恶意行为者更具弹性。

您可以自己构建自己的测试网络,也许使用 kubernetes 或 docker-compose,但也许您很快就能轻松完成。

账户和钱包

以太坊账户是私钥和公钥的地址对。 它们可用于存储以太币并且无需消耗气体即可创建。

钱包是用于管理以太币的智能合约(一些代码)。 这是一个用 solidity 编写的钱包,运行在 Mist 浏览器上。 他们可以有很多功能,比如多用户签名,文件? 等等

这样,我们就正确定义了这两个名词。 前面我们看到别人对这两个名词的混淆,把所有可以存储以太币的东西都叫做Wallet。

EVM 和智能合约创建状态

在每个全节点网络上运行的智能合约代码在 EVM 中执行。 这是你的标准虚拟机,执行一些字节码,除了这个 vm 与网络、文件系统、进程等隔离。没有人想写字节码,所以我们有一些更高级的语言可以编译成 EVM 字节码。

坚固性

Solidity 是最早用于描述智能合约的语言之一。 目前最流行的语言,因此拥有最多的示例、文档和教程。 除非你有其他理由学习它,否则你应该学习它。

您可以使用基于浏览器的 Remix IDE 进行快速验证。

这是一个 Solidity 合约:

pragma solidity ^0.4.11;

合约 BasicToken {

映射(地址=> uint256)余额; functiontransfer(address _to, uint256 _value) returns() {

余额[msg.sender] = balances[msg.sender] - _value;

余额[_to] = 余额[_to] + _value;

}函数balanceOf(地址_所有者)常量返回(uint256 balance){

返回余额[_owner];

}

}

生命周期

LLL 是一种 Lisp 风格的低级编程语言,如语言名称所示。 虽然以太坊官方并未将其作为主要支持语言,但仍在持续更新中,与solidity在同一个仓库中。

这是一份用 LLL 语言编写的 ERC20 代币合约

LLL 的例子如下:

(序列

(def '节点字节 0x00)

(def '所有者 0x20) ; 地址

(def 'set-node-owner 0x5b0fc9c3) ; setOwner(bytes32,地址)

(def 'get-owner (node)

(sload (+ 节点所有者)))

//举个例子,不能编译

如果你正在学习,可能不太容易习惯 LLL 语言的书写。

Serpent 是一种类 Python 的高级语言,最终将被编译成 EVM 字节码。 它主要由 Augur 团队使用。

但近期 Zeppelin Solution 团队发现其编译器存在严重 bug,在问题修复前不建议继续使用。

如果你对 Augur 如何解决这些漏洞感兴趣,可以阅读 Zeppelin Solution 的这篇文章。

Serpent 的合约如下所示:

defregister(键,值):

# 密钥尚未领取

ifnotself.storage[key]:

self.storage[键] = 值

返回(1)

别的:

return(0) # 密钥已经被领取

defask(键):

返回(自我。存储[键])

其他

还有一堆其他的高级语言处于各种可用性和开发状态,毫无疑问会被开发出来。 为了广泛采用,语言和编译器必须经过彻底审查和测试,这当然需要时间。

智能合约反编译/反汇编

以太坊智能合约的字节码可以通过prosity进行反编译,可以使用evmdis进行反汇编。

智能合约安全

智能合约一旦部署在以太坊网络上,就不可更改,永远存在。 如果你写了一个bug,你将无法去除有bug的版本,你只能在后续版本中修复它。

由于许多开发以太坊和其他智能合约平台的工程师都来自网络开发,所以这个概念是如此新颖和疯狂。

ConsenSys 有一个很棒的资源,叫做智能合约最佳实践,你应该很好地理解它。

对 Parity 钱包黑客攻击的解释。

当你部署你的智能合约时,由于你管理的是真实资金,你应该首先启动一个赏金计划,并尽量确保它经过全面测试。

耳语

Whisper 是集成到以太坊中的消息系统。 它允许 DApp 发布少量信息,用于非实时消息通信。

它使用 shh 协议。

虽然已经有一段时间没有更新了,但这里有一个使用 Whisper 协议实现聊天客户端的例子。

去中心化自动化组织 (DAO)

这是一个组织(如一群人),其中代码用于确保最终执行,而不是传统的法律文件。 这群人使用智能合约来做普通组织所做的所有事情,比如对某事进行投票,决定是否投资某事等。

副作用是投资的决策、管理和结果将不可更改地存储在区块链上。

之前 slock.it 创建了一个标准的 DAO 框架来说明这个概念。 这里简单介绍一下DAO的概念,以及如何使用框架实现自己的DAO(译者注:本项目因bug被hack)。

阿拉贡

Aragon 也在接受挑战,设计一家按照智能合约逻辑运作的公司,重点是创建一家可以接受投资、处理会计、支付员工工资、分配股权并完成日常工作的公司。我们现在所知道的公司的业务。 他们还实现了一个很好的 DApp 客户端,以便更轻松地使用他们的协议。

在此处查看 Aragon 核心合约,以了解更多有关其工作原理的信息。

IPFS 和文件币

IPFS(星际文件系统)是一种用于分发文件的协议。 您可以将其视为基于 bittorrent 和 git 等概念的文件系统,其中文件可以定位并且不可变。 IPFS将信息存储在IPLD数据模型中,这个非常有趣,并且提供了一些特殊的特性,你可以通过下面的描述来了解。

这是一个新的协议,它有一个http网关和文件系统适配器,它允许你通过http将整个互联网文件系统挂载到你的本地磁盘/ipfs。 IPFS 还提供寻址服务 IPNS(Interplanetary Name Space),它允许可变状态(注意 IPFS 中的所有内容都是不可变的)。 您甚至可以使用 DNS TXT 记录来定位您的 IPNS 客户端,从而允许您生成指向相应数据的用户友好链接。

FileCoin 是 Protocol Lab 致力于打造一个基于 IPFS 的去中心化存储市场的成果,即为全网提供存储资源的激励层。 FileCoin 的共识协议不使用资源浪费的工作量证明,而是使用 Proff of Replication 和 Proof of SpaceTime 来确保每条数据都被复制到特定的副本数并存储特定的时间。

您应该阅读 IPFS 白皮书、FileCoin 白皮书和 IPLD 规范。

由于FileCoin还没有上线,大家可以使用目前的IPFS存储网络运行html/css/js,作为类似orbit-db的数据库使用。

一群

Swarm 是一个集成在以太坊生态系统中的去中心化存储网络。 作为第一阵营的项目,关于IPFS和本项目的对比和优缺点请看这里。 但本质上,它基本上是一样的,除了他们有不同的哲学并且在引擎盖下使用稍微不同的协议。

以太坊以太坊开发