主页 > imtoken安卓ico > 科普 | 走进以太坊,第 2 部分

科普 | 走进以太坊,第 2 部分

imtoken安卓ico 2023-11-11 05:12:45

与智能合约的交互

通过连接到以太坊节点并使用 JSON-RPC 调用接口执行函数,您可以与智能协议进行交互(即执行方法和读取状态)。 有各种以开发人员友好的方式实现此功能的以太坊节点客户端。 Geth 和 parity 都提供了一个控制台/浏览器来与合约进行交互。

如果您想以编程方式与合约交互,也有各种以太坊客户端实现。 比较流行的是 JavaScript、web3.js、ethjs 和 ethers.js。 对于go语言,go-ethereum(geth)中的可执行abigen工具提供了go语言版本的包,实现与合约的交互。 基本上,它只是一个标准的 JSON RPC 协议调用接口,因此如果没有,您可以使用您选择的语言编写自己的适配器。 除了简单的函数执行之外,一些客户端库还支持便利函数。

使用 Ganache(以前称为 ethereumjs-testrpc)运行本地以太坊节点以进行测试和开发。

当你配置一个智能合约时,你真正做的就是将交易发送到零地址(0x0),并将合约字节码作为参数。

以下是有关交易的更多信息:

以太坊交易的内幕

Truffle、Embark、Populous、Perigord 和其他编程语言的框架

一旦开始编写智能合约,您最终会一遍又一遍地做很多相同的事情,将源代码编译为字节码和二进制接口,将其部署到网络,测试配置的合约等。您可能还会想要一个好的方法来尝试你的新想法。

Truffle、Embark、Populous 和 Perigord 等框架将许多琐碎的任务标准化和自动化,为合约编写、合约配置以及最重要的合约测试提供了良好的开发体验。

Truffle(用Node编写)是采用率最高、开发进程最活跃的开发框架。 查看入门指南以跟上每个人的步伐。

下面的帖子有很多有用的信息,并使用 truffle 部署合约并与之交互。

以太坊智能合约漫游指南

Embark(Node 语言)和 Truffle 对于开发者构建项目有着相似但不同的理念。

Perigord(Go 语言)与 Truffle 非常相似。

Populous(Python语言)是一个满足同组需求的开发框架,用Python编写。

当您第一次签订合同时,在了解它带来的价值之前,您应该尽量不要使用框架,就像您在刚接触 HTML 时应该避免使用 Rails 框架一样。 你可以先用 Remix 尝试编程语言和想法。

ETHPM 和 NPM

分享意味着关爱,ETHPM是一个去中心化的智能合约打包资源库。 使用ETHPM,您可以继承或连接其他知名合约或类库,减少代码重复,理想地为未来的合约开发提供坚实的基础。

您可以使用 NPM 提供智能合约代码来安装节点。 很多人都在做这个,比较有名的是Open Zeppelin。

阅读细则以了解更多相关信息和背景。

网络状态

Mainnet - 以太坊主网,通常是默认网络,无论您使用哪个客户端或浏览器。

Ropsten - 以太坊使用工作量证明的主要测试网。 由于计算负载低,该网络容易受到 DDOS 攻击、网络分叉和其他干扰。 Ropsten 在受到垃圾邮件攻击后被暂时禁用,直到最近才恢复。 它的 gas limit 一直很低,许多合约无缘无故地无法部署到这个网络上。

Kovan - 一个仅由奇偶校验客户端组成的测试网络,使用权威证明来突出对垃圾邮件攻击的免疫力,并保持 4 秒的阻塞时间。

Rinkeby - 一个仅由 geth 客户端组成的测试网络,使用 Clique 共识算法,尽管计算强度较低,但它更能抵抗恶意行为。 (我个人的最爱)

您还可以创建自己的私有以太坊网络。 go-ethereum团队开发了puppeth来配置全网,配备了定制的bootnode工具、创世块和共识规则,推动了Rinkeby网络的建设。 你也可以构建自己的网络基础设施,你可以使用 kubernetes 或 docker-compose。 但您可能很快就不需要设置专用网络。

比较“账户”和“钱包”

以太坊账户是一对私钥和地址。 它主要只是用于存储以太币,并且创建一个帐户不需要花费 gas(因为每个可能的地址都会自动存在)。 以太坊网络上的所有交易都是从账户发起的,合约不能发起交易。

只要满足以下两点之一,就可以称为钱包。

它是一个专门构建的界面,使用您的帐户创建和发送交易(如 MyEtherWallet)。

它只是一个发送和接收以太币的智能合约(同样,只是一些代码)。

这不是原生概念。 这是 GitHub 平台上钱包的 Solidity 实现,通过 Mist 浏览器使用。 它们可以有多种样式,如多重签名、纸质表格等。

既然我们已经准确定义了这两个概念,请注意人们到处混淆这两个术语,将所有可以发送/接收以太币的东西都标记为钱包,并将所有东西都称为账户。

EVM 和智能合约工件的状态

您的智能合约代码在网络中每个完整节点上的 EVM(以太坊虚拟机)中运行。 除了需要与网络、文件系统和进程进行特殊隔离外,EVM 是执行字节码的标准虚拟机。 没有人愿意写字节码,所以我们使用一些高级语言来编译成 EVM 字节码。

坚固的语言

Solidity 是第一种描述智能合约的语言。 它也是目前最流行的语言,因此拥有最多的示例、参考和教程。 除非你有更好的理由,否则你应该学习这门语言。

您可以在基于浏览器的 Solidity 合约代码编辑器 Remix 下使用 Solidity 语言。 以下是 Solidity 语言的合约:

pragma solidity ^0.4.11; contract BasicToken { mapping(address => uint256) balances; function transfer(address _to, uint256 _value) returns () {    balances[msg.sender] = balances[msg.sender] - _value;    balances[_to] = balances[_to] + _value;  } function balanceOf(address _owner) constant returns (uint256 balance) {    return balances[_owner];  } }

LLL(Lisp 语言家族)

LLL 是一种 Lisp 风格的低级语言以太坊节点搭建有什么用,名副其实。 虽然它不被以太坊团队视为主要支持的语言,但它仍在不断更新,并与 Solidity 在同一个存储库中。

下面是一个用 LLL 语言编写的 ERC20 合约的例子。

LLL语言如下:

(seq  (def 'node-bytes  0x00)  (def 'owner    0x20) ; address  (def 'set-node-owner    0x5b0fc9c3) ; setOwner(bytes32,address)  (def 'get-owner (node)      (sload (+ node owner))) .... 这仅仅是个例证,完全不能编译。

如果你正在学习,你可能不想在 LLL 中写任何东西。

蛇语

Serpent 是一种类似 Python 的高级语言,可编译为 EVM 字节码。 由于在 Zeppelin 中发现了大量严重和危险的漏洞,该语言已被有效弃用。 有关该语言的入门知识,请参阅下面的 Vyper。

Serpent 编译器的审计

Vyper 语言(以前称为 Viper)

Vyper 也是一种受 Python 启发的编程语言,强调安全性、简单性和稳定性。 该语言目前正在开发中。

竹语

Bamboo 是一种将智能合约描述为有限状态机的语言,将智能合约视为状态和交易的函数,同时生成新的状态。 这种语言目前也在开发中。

其他语言

还有大量的其他高级语言正在不同程度地使用或发展。 而且,肯定还会有更多类似的语言相继开发出来。 为了更广泛地采用,编程语言和编译器必须经过彻底审查和测试以太坊节点搭建有什么用,这需要时间。

智能合约的反编译/反汇编

我们使用 prosity 反编译或者使用 evmdis 反汇编以太坊智能合约字节码。 这是一个不断发展的领域,新工具的开发速度相当快。 令人敬畏的以太坊虚拟机存储库包含有关此的更多信息。

pirapira/awesome-ethereum-虚拟机

智能合约安全

智能合约一旦部署在以太坊上,就无法更改,将永远存在。 如果你写的代码有 bug,这个有 bug 的版本是没有办法从以太坊上下来的,那么你只能继续修复它*。

由于许多在以太坊和其他智能合约平台上工作的工程师都来自网络开发领域,所以这个概念可能相对较新和疯狂。

无论是在语言层面还是在高级逻辑层面,您的代码都可能陷入各种安全陷阱。 当您部署将管理真实资金的生产智能合约时,您需要对合约的运行有 100% 的信任。

ConsenSys 有一个优秀的智能合约最佳实践库,您应该深入研究。

奇偶钱包黑客解释

Parity Wallet Hack 解释第 2 部分:Electric Boogaloos

在部署将使用真实资金运行的智能合约之前,您应该打开漏洞赏金以进行渗透测试。 如果您管理的是真钱,您的代码应该已经过专业审查。

*可以使用 selfdestruct() 函数从网络中删除合约。

耳语(耳语协议)

Whisper 是集成到以太坊中的消息系统。 它允许 dApps 发布少量信息以进行非实时通信。

它使用 shh 协议,这是一个非常聪明的协议。 令人惊讶的是,这个协议的相关文件非常少,采用率也很低。

虽然有一段时间没有更新,但这里有一个示例 dapp,一个使用 Whisper 实现的聊天客户端。

Whisper 是否得到有效开发还有待商榷。

去中心化自治组织 (DAO)

这是一个组织(就像一群人),他们使用一堆智能合约执行而不是法律文件。 这群人使用这些合同来做一个组织所做的所有常见事情,比如对某事进行投票,决定为所有当地合作社建筑涂上什么颜色。

这样做的一个副作用是,决策、治理和给建筑物涂上什么颜色都不变地存储在区块链上(以合同状态的形式)。 这很酷!

对 Ethereum Classic 和 The DAO 的攻击

您可能听说过“DAO hack”及其严重性。 此漏洞的发生是由于现在备受关注的重入错误,其中恶意合约可能导致对合约的非无限循环访问,从而导致其错误地更新其内部状态。 如果这个错误发生在 DAO 合约下,就意味着将大量资金发送给本应只收到少量资金的人。 社区以压倒性多数投票决定对网络进行硬分叉,将资金返还给 DAO 支持者。 其结果就是以太坊经典(Ethereum Classic)的诞生。 Ethereum Classic 没有归还被黑客入侵的资金。 之前写的代码就是这个领域的规律,无法恢复。

阿拉贡

Aragon 还在应对建立一家按照智能合约逻辑运作的公司的挑战,着眼于创建一家接受投资、管理财务、支付员工工资、分配股权和开展业务的公司,而不是像我们今天所知道的那样一个组织。 他们还在开发一个优秀的 dApp 客户端,以尽可能轻松地使用他们的协议。

查看 Aragon 核心合约以更好地了解其工作原理。

群(群协议)

Swarm 是一个去中心化存储网络,作为首批项目之一在以太坊生态系统中开发。 看看这篇维基百科文章:领先的 Swarm 开发人员比较/对比两个项目(Swarm 与 IPFS)。 它的要点是:它们本质上是相同的,除了略有不同的理念和不同的幕后协议。

原始链接:@mattcondon/getting-up-to-speed-on-ethereum-63ed28821bbe