# 以太坊开发入门4

By [Untitled](https://paragraph.com/@0x6bda405d05eaf5ed9b69f49f63238fca95fc5b7e) · 2021-11-23

---

**以太坊节点**

与比特币的节点类似。每个节点都存储了整个区块链的数据，并重放所有的交易以验证结果的状态。你可以通过geth（[https://github.com/ethereum/go-ethereum/wiki/geth）来运行一个全节点（官方的节点，go语言），或者parity来运行一个轻节点，它是第三方的，Rust语言写的。](https://github.com/ethereum/go-ethereum/wiki/geth%EF%BC%89%E6%9D%A5%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA%E5%85%A8%E8%8A%82%E7%82%B9%EF%BC%88%E5%AE%98%E6%96%B9%E7%9A%84%E8%8A%82%E7%82%B9%EF%BC%8Cgo%E8%AF%AD%E8%A8%80%EF%BC%89%EF%BC%8C%E6%88%96%E8%80%85parity%E6%9D%A5%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA%E8%BD%BB%E8%8A%82%E7%82%B9%EF%BC%8C%E5%AE%83%E6%98%AF%E7%AC%AC%E4%B8%89%E6%96%B9%E7%9A%84%EF%BC%8CRust%E8%AF%AD%E8%A8%80%E5%86%99%E7%9A%84%E3%80%82)

你的节点需要知道从哪个区块链下载数据，以及与哪些节点交互，后面会说明一些常见的网络。

你也许可以运行下所有这些节点客户端。如果你不想自己运行一个这样的节点，有第三方的网关服务，比如Infura（[https://infura.io/）可以选择。另外还有专门用于测试和开发的，本地版本的节点，后面会提到。](https://infura.io/%EF%BC%89%E5%8F%AF%E4%BB%A5%E9%80%89%E6%8B%A9%E3%80%82%E5%8F%A6%E5%A4%96%E8%BF%98%E6%9C%89%E4%B8%93%E9%97%A8%E7%94%A8%E4%BA%8E%E6%B5%8B%E8%AF%95%E5%92%8C%E5%BC%80%E5%8F%91%E7%9A%84%EF%BC%8C%E6%9C%AC%E5%9C%B0%E7%89%88%E6%9C%AC%E7%9A%84%E8%8A%82%E7%82%B9%EF%BC%8C%E5%90%8E%E9%9D%A2%E4%BC%9A%E6%8F%90%E5%88%B0%E3%80%82)

如果你正在开发一个DApp的客户端，你并不总是需要主动提供连接到以太坊的节点。因为DApp的浏览器一般会提供对应的连接（译者注：话说这样，那使用这个，还得额外安装一个DApp浏览器呀）。

**以太坊代币**

现在你应该知道我们可以通过写智能合约，并将状态存到区块链上了？那如果，在状态这块，我们存的是一个Map类型，键是地址，值是整数。然后我们将这些整数值叫做余额，谁的余额呢？它就是我们要说的代币（译者注：代币的数据结构就是这样简单，存的就是某个用户，它当前的余额）。

是的，所有你刚才听到的代币，只是一些数据，存储在一个哈希表里，通过api或者所谓的协议，来进行增删改查。这是一个简单的基本合约（[https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/BasicToken.sol）。](https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/BasicToken.sol%EF%BC%89%E3%80%82)

你可以看看ethereum的创建一个众筹合约的官方教程（[https://www.ethereum.org/crowdsale）。你将会发现它仅仅是一个合约（Crowdsale）与另一个合约（MyToken）交互，和前面的基本合约类似。并没有什么神奇的地方。](https://www.ethereum.org/crowdsale%EF%BC%89%E3%80%82%E4%BD%A0%E5%B0%86%E4%BC%9A%E5%8F%91%E7%8E%B0%E5%AE%83%E4%BB%85%E4%BB%85%E6%98%AF%E4%B8%80%E4%B8%AA%E5%90%88%E7%BA%A6%EF%BC%88Crowdsale%EF%BC%89%E4%B8%8E%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%90%88%E7%BA%A6%EF%BC%88MyToken%EF%BC%89%E4%BA%A4%E4%BA%92%EF%BC%8C%E5%92%8C%E5%89%8D%E9%9D%A2%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%90%88%E7%BA%A6%E7%B1%BB%E4%BC%BC%E3%80%82%E5%B9%B6%E6%B2%A1%E6%9C%89%E4%BB%80%E4%B9%88%E7%A5%9E%E5%A5%87%E7%9A%84%E5%9C%B0%E6%96%B9%E3%80%82)

人们使用代币来做各种各样的事情，阻拦大家如何使用的只有想像力。代币常常用来激励用户与某个协议进行交互，或者证明对某个资产的所有权，投票权等等。Coinbase的Fred有一个很好的关于代币，为什么存在，如何使用的文章（[https://www.youtube.com/watch?v=rktHO5R8Y9c）。](https://www.youtube.com/watch?v=rktHO5R8Y9c%EF%BC%89%E3%80%82)

Ethereum的创始人Vitalik最近有一个关于代币发售模型，也是一篇不错的文章（[http://vitalik.ca/general/2017/06/09/sales.html）。](http://vitalik.ca/general/2017/06/09/sales.html%EF%BC%89%E3%80%82)

**ERC20代币与ERC23代币**

每个人都开始定义自己与代币的交互协议，但这些很快显得陈旧，所以一些人开始集结起来，创建了ERC20代币接口标准（[https://github.com/ethereum/eips/issues/20）。大概意思是说，我们定义这些接口，这样大家可以相互统一调用，比如转帐定义为transfer，第一个参数为要转去的帐户地址address](https://github.com/ethereum/eips/issues/20%EF%BC%89%E3%80%82%E5%A4%A7%E6%A6%82%E6%84%8F%E6%80%9D%E6%98%AF%E8%AF%B4%EF%BC%8C%E6%88%91%E4%BB%AC%E5%AE%9A%E4%B9%89%E8%BF%99%E4%BA%9B%E6%8E%A5%E5%8F%A3%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%A4%A7%E5%AE%B6%E5%8F%AF%E4%BB%A5%E7%9B%B8%E4%BA%92%E7%BB%9F%E4%B8%80%E8%B0%83%E7%94%A8%EF%BC%8C%E6%AF%94%E5%A6%82%E8%BD%AC%E5%B8%90%E5%AE%9A%E4%B9%89%E4%B8%BAtransfer%EF%BC%8C%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%E4%B8%BA%E8%A6%81%E8%BD%AC%E5%8E%BB%E7%9A%84%E5%B8%90%E6%88%B7%E5%9C%B0%E5%9D%80address) \_to，第二个参数为要发送的ether的uint \_value数量。

有些人觉得ERC20协议过于复杂了，所以他们提议了ERC197（[https://github.com/ethereum/EIPs/issues/179），稍微简单一点。](https://github.com/ethereum/EIPs/issues/179%EF%BC%89%EF%BC%8C%E7%A8%8D%E5%BE%AE%E7%AE%80%E5%8D%95%E4%B8%80%E7%82%B9%E3%80%82)

由于在ERC20中存在的一个小问题，有人提议了一个新的ERC23（[https://github.com/ethereum/EIPs/issues/223）。ERC23是向后兼容ERC20的。如果你已经创建了一个代币合约，可以尝试来支持ERC23。](https://github.com/ethereum/EIPs/issues/223%EF%BC%89%E3%80%82ERC23%E6%98%AF%E5%90%91%E5%90%8E%E5%85%BC%E5%AE%B9ERC20%E7%9A%84%E3%80%82%E5%A6%82%E6%9E%9C%E4%BD%A0%E5%B7%B2%E7%BB%8F%E5%88%9B%E5%BB%BA%E4%BA%86%E4%B8%80%E4%B8%AA%E4%BB%A3%E5%B8%81%E5%90%88%E7%BA%A6%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%B0%9D%E8%AF%95%E6%9D%A5%E6%94%AF%E6%8C%81ERC23%E3%80%82)

> 看起来ERC223和ERC23是相同的概念；ERC的值是223，但是当引用时，作者和所有的其它人误写成了ERC23非常多次，它现在也还是这样引用的。如果一句话说清楚的话，ERC223是规范号，代币说明时称为ERC23代币就好了。

**协议代币与App币**

协议代币为用来激励对某个协议的使用。比如，REP，Augur的声誉代币，用来鼓励对Augur去中心化预测协议的使用。大多数的以太坊的ERC20/ERC23代币都是协议代币，比如Golem的GNT，ICONOMI，BAT等等。

App币则是用来激励对某个特定DApp或客户端的使用，而不是因为其使用的协议提供的价值。其中一个例子是Status的SNT代币，可以用来在应用内获得价值（比如，进行消息推送，投票权，获得用户名等等）。

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

之前，这并不可能，因为加密代币，以及接下来的协议创新的时代（[http://continuations.com/post/148098927445/crypto-tokens-and-the-coming-age-of-protocol），为了实现货币化，你自己可以在协议之上创建一个应用，并实现赢利。因为你自己可以实现协议的货币化，大家可以在未来更好的协作。](http://continuations.com/post/148098927445/crypto-tokens-and-the-coming-age-of-protocol%EF%BC%89%EF%BC%8C%E4%B8%BA%E4%BA%86%E5%AE%9E%E7%8E%B0%E8%B4%A7%E5%B8%81%E5%8C%96%EF%BC%8C%E4%BD%A0%E8%87%AA%E5%B7%B1%E5%8F%AF%E4%BB%A5%E5%9C%A8%E5%8D%8F%E8%AE%AE%E4%B9%8B%E4%B8%8A%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%BA%94%E7%94%A8%EF%BC%8C%E5%B9%B6%E5%AE%9E%E7%8E%B0%E8%B5%A2%E5%88%A9%E3%80%82%E5%9B%A0%E4%B8%BA%E4%BD%A0%E8%87%AA%E5%B7%B1%E5%8F%AF%E4%BB%A5%E5%AE%9E%E7%8E%B0%E5%8D%8F%E8%AE%AE%E7%9A%84%E8%B4%A7%E5%B8%81%E5%8C%96%EF%BC%8C%E5%A4%A7%E5%AE%B6%E5%8F%AF%E4%BB%A5%E5%9C%A8%E6%9C%AA%E6%9D%A5%E6%9B%B4%E5%A5%BD%E7%9A%84%E5%8D%8F%E4%BD%9C%E3%80%82)

你也许可以阅读一下，关于0xProject的下面这篇文章，关于这两者区别的详细说明（[https://blog.0xproject.com/the-difference-between-app-coins-and-protocol-tokens-7281a428348c）。](https://blog.0xproject.com/the-difference-between-app-coins-and-protocol-tokens-7281a428348c%EF%BC%89%E3%80%82)

**与智能合约交互**

你与智能合约的交互（也称做调用函数和读取状态）通过连接到某个以太坊节点，并执行操作码。当前有各种各样的以太坊客户端，可以方便进行开发。Geth和parity都提供了控制台或浏览器的方式来更好的与智能合约交互。

如果你想要一个程序的库用来与智能合约交互的接口，也有这样的客户端实现。对于JS语言，可以使用web3.js。以于go语言，可以使用在go-ethereum（[https://github.com/ethereum/go-ethereum）中的abigen的程序，提供了go包，用来与智能合约交互。](https://github.com/ethereum/go-ethereum%EF%BC%89%E4%B8%AD%E7%9A%84abigen%E7%9A%84%E7%A8%8B%E5%BA%8F%EF%BC%8C%E6%8F%90%E4%BE%9B%E4%BA%86go%E5%8C%85%EF%BC%8C%E7%94%A8%E6%9D%A5%E4%B8%8E%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6%E4%BA%A4%E4%BA%92%E3%80%82)

如果只是用来测试和开发，可以使用ethereumjs-testrpc（[https://github.com/ethereumjs/testrpc）来运行一个本地节点（译者注：这个节点压短区块时间等，可以方便打整的开发与测试）。](https://github.com/ethereumjs/testrpc%EF%BC%89%E6%9D%A5%E8%BF%90%E8%A1%8C%E4%B8%80%E4%B8%AA%E6%9C%AC%E5%9C%B0%E8%8A%82%E7%82%B9%EF%BC%88%E8%AF%91%E8%80%85%E6%B3%A8%EF%BC%9A%E8%BF%99%E4%B8%AA%E8%8A%82%E7%82%B9%E5%8E%8B%E7%9F%AD%E5%8C%BA%E5%9D%97%E6%97%B6%E9%97%B4%E7%AD%89%EF%BC%8C%E5%8F%AF%E4%BB%A5%E6%96%B9%E4%BE%BF%E6%89%93%E6%95%B4%E7%9A%84%E5%BC%80%E5%8F%91%E4%B8%8E%E6%B5%8B%E8%AF%95%EF%BC%89%E3%80%82)

当你部署了一个智能合约，你实际进行的操作是向地址0x0发送了一个交易，使用当前合约内容作为参数，一个以太坊交易详解（[https://medium.com/@codetractio/inside-an-ethereum-transaction-fa94ffca912f）。](https://medium.com/@codetractio/inside-an-ethereum-transaction-fa94ffca912f%EF%BC%89%E3%80%82)

---

*Originally published on [Untitled](https://paragraph.com/@0x6bda405d05eaf5ed9b69f49f63238fca95fc5b7e/4)*
