以太坊节点
与比特币的节点类似。每个节点都存储了整个区块链的数据,并重放所有的交易以验证结果的状态。你可以通过geth(https://github.com/ethereum/go-ethereum/wiki/geth)来运行一个全节点(官方的节点,go语言),或者parity来运行一个轻节点,它是第三方的,Rust语言写的。
你的节点需要知道从哪个区块链下载数据,以及与哪些节点交互,后面会说明一些常见的网络。
你也许可以运行下所有这些节点客户端。如果你不想自己运行一个这样的节点,有第三方的网关服务,比如Infura(https://infura.io/)可以选择。另外还有专门用于测试和开发的,本地版本的节点,后面会提到。
如果你正在开发一个DApp的客户端,你并不总是需要主动提供连接到以太坊的节点。因为DApp的浏览器一般会提供对应的连接(译者注:话说这样,那使用这个,还得额外安装一个DApp浏览器呀)。
以太坊代币
现在你应该知道我们可以通过写智能合约,并将状态存到区块链上了?那如果,在状态这块,我们存的是一个Map类型,键是地址,值是整数。然后我们将这些整数值叫做余额,谁的余额呢?它就是我们要说的代币(译者注:代币的数据结构就是这样简单,存的就是某个用户,它当前的余额)。
是的,所有你刚才听到的代币,只是一些数据,存储在一个哈希表里,通过api或者所谓的协议,来进行增删改查。这是一个简单的基本合约(https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/BasicToken.sol)。
你可以看看ethereum的创建一个众筹合约的官方教程(https://www.ethereum.org/crowdsale)。你将会发现它仅仅是一个合约(Crowdsale)与另一个合约(MyToken)交互,和前面的基本合约类似。并没有什么神奇的地方。
人们使用代币来做各种各样的事情,阻拦大家如何使用的只有想像力。代币常常用来激励用户与某个协议进行交互,或者证明对某个资产的所有权,投票权等等。Coinbase的Fred有一个很好的关于代币,为什么存在,如何使用的文章(https://www.youtube.com/watch?v=rktHO5R8Y9c)。
Ethereum的创始人Vitalik最近有一个关于代币发售模型,也是一篇不错的文章(http://vitalik.ca/general/2017/06/09/sales.html)。
ERC20代币与ERC23代币
每个人都开始定义自己与代币的交互协议,但这些很快显得陈旧,所以一些人开始集结起来,创建了ERC20代币接口标准(https://github.com/ethereum/eips/issues/20)。大概意思是说,我们定义这些接口,这样大家可以相互统一调用,比如转帐定义为transfer,第一个参数为要转去的帐户地址address _to,第二个参数为要发送的ether的uint _value数量。
有些人觉得ERC20协议过于复杂了,所以他们提议了ERC197(https://github.com/ethereum/EIPs/issues/179),稍微简单一点。
由于在ERC20中存在的一个小问题,有人提议了一个新的ERC23(https://github.com/ethereum/EIPs/issues/223)。ERC23是向后兼容ERC20的。如果你已经创建了一个代币合约,可以尝试来支持ERC23。
看起来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),为了实现货币化,你自己可以在协议之上创建一个应用,并实现赢利。因为你自己可以实现协议的货币化,大家可以在未来更好的协作。
你也许可以阅读一下,关于0xProject的下面这篇文章,关于这两者区别的详细说明(https://blog.0xproject.com/the-difference-between-app-coins-and-protocol-tokens-7281a428348c)。
与智能合约交互
你与智能合约的交互(也称做调用函数和读取状态)通过连接到某个以太坊节点,并执行操作码。当前有各种各样的以太坊客户端,可以方便进行开发。Geth和parity都提供了控制台或浏览器的方式来更好的与智能合约交互。
如果你想要一个程序的库用来与智能合约交互的接口,也有这样的客户端实现。对于JS语言,可以使用web3.js。以于go语言,可以使用在go-ethereum(https://github.com/ethereum/go-ethereum)中的abigen的程序,提供了go包,用来与智能合约交互。
如果只是用来测试和开发,可以使用ethereumjs-testrpc(https://github.com/ethereumjs/testrpc)来运行一个本地节点(译者注:这个节点压短区块时间等,可以方便打整的开发与测试)。
当你部署了一个智能合约,你实际进行的操作是向地址0x0发送了一个交易,使用当前合约内容作为参数,一个以太坊交易详解(https://medium.com/@codetractio/inside-an-ethereum-transaction-fa94ffca912f)。
