一、以太坊
APPLY({ Alice: $50, Bob: $50 },“send $70 from Alice to Bob”) = ERROR
比特币中的“状态”是指已开采但尚未花费的所有硬币(从技术上来说,是“未花费的交易输出”或UTXO)的集合,每个UTXO都有一个面额和一个所有者(由20个字节的地址定义,本质上是一个加密的公共密钥fn。1)。事务包含一个或多个输入,每个输入包含对现有UTXO的引用和由与所有者地址相关联的私钥产生的加密签名,以及一个或多个输出,每个输出包含要添加到的新UTXO状态。
状态转换函数APPLY(S,TX) -> S’可以大致定义如下:
1、对于中的每个输入TX:
如果引用的UTXO不在中S,则返回错误。
如果提供的签名与UTXO的所有者不匹配,则返回错误。
2、如果所有输入UTXO的面额之和小于所有输出UTXO的面额之和,则返回错误。
3、返回S’所有输入UTXO删除,并添加所有输出UTXO。
二、以太坊账户
In Ethereum, the state is made up of objects called “accounts”, with each account having a 20-byte address and state transitions being direct transfers of value and information between accounts. An Ethereum account contains four fields:(在以太坊中,状态由称为“帐户”的对象组成,每个帐户都有一个20字节的地址,状态转换是帐户之间价值和信息的直接转移。以太坊账户包含四个字段:)
The nonce, a counter used to make sure each transaction can only be processed once
The account’s current ether balance
The account’s contract code, if present
The account’s storage (empty by default)
该随机数,计数器用来确保每笔交易只能一次处理
该账户当前的以太币余额
帐户的合同代码(如果有)
帐户的存储空间(默认为空)
通常,有两种类型的帐户: 由私钥控制的外部拥有的帐户和 由其合同代码控制的合同帐户。外部拥有的帐户没有代码,并且可以通过创建和签名交易从外部拥有的帐户发送消息;在合同帐户中,合同帐户每次收到消息都会激活其代码,从而使其能够读取和写入内部存储并发送其他消息或依次创建合同。
三、消息和交易
以太坊中使用的术语“交易”是指已签名的数据包,用于存储要从外部拥有的帐户发送的消息。交易包含:
- 邮件的收件人
- 识别发件人的签名
- 从发送者转移到接收者的以太币数量
- 可选数据字段
- 一个STARTGAS值,表示允许事务执行执行的最大计算步骤数
- 一个GASPRICE值,表示发件人每计算步骤要支付的费用
四、去中心化应用DApp
DApp是一种“服务端”运行在区块链网络上的应用,类似于app运行在Android/iOS等设备上,DApp运行在以太坊网络上。以太坊在GitHub下有一个代码仓库dapp-bin(https://github.com/ethereum/dapp-bin),里面有一些文档和示例。使用前,你需要看看文件最近的状态,因为他们将很可能已经被淘汰。
五、DApp浏览器
一个DApp浏览器,正如它字面所表达的,用来让DApp客户端(常常使用JS与以太坊的智能合约进行交互)的使用更加容易。
DApp浏览器的主要目的是:
提供到一个以太坊节点的连接(或者连接到一个本地节点或者远程节点),和一个方便的切换不同节点(甚至是不同的网络)。
提供一个帐户(或者一个钱包)来方便用户与DApp交互。
- Mist
Mist(https://github.com/ethereum/mist)是以太坊官方的DApp浏览器。一个漂亮的界面来与以太坊节点交互,与智能合约发、收交易。
- Status
Status(https://status.im/)是一个手机上可以使用的DApp浏览器。
- MetaMask
MetaMask(https://metamask.io/)是一个Google浏览器扩展,把Chrome变成了一个DApp浏览器。它的核心特性是注入以太坊提供的js客户端库web3,到每一个界面,来让DApp连接到MetaMask提供的以太坊节点服务。不过这个Chrome扩展,可以允许你管理你的钱包,以及连接到不同的以太坊网络(包括本地的开发网络)。
- Parity
Parity是一个以太坊客户端(也是一个全节点的实现),集成到了Web浏览器,并使之成为一个DApp浏览器。
六、以太坊网络
Mainnet-以太坊主网,通常是所有客户端的默认网络。
Ropsten - 以太坊使用工作量证明的主测试网络。这个网络,因为低的计算量,容易遭到DDOS攻击,分片,或者其它问题。垃圾邮件攻击后被暂时放弃,最近才恢复使用。
链接:https://github.com/ethereum/ropsten
Kovan -parity客户端组成的测试网络,使用授权证明来提升对垃圾邮件攻击的抗扰度,并且持续4秒的阻塞时间。
链接:https://github.com/kovan-testnet/proposal
Rinkeby-geth客户端组成的测试网络,使用集团共识,尽管计算量低,但是对恶意行为者更有弹性。
你可以自己搭建你自己的测试网络,也许使用
kubernetes(https://github.com/MaximilianMeister/kuberneteth)
或者
docker-compose(https://capgemini.github.io/blockchain/ethereum-docker-compose)
但也许你将很快就可以不需要花什么时间。
七、Truffle和Embark
一旦你开始写智能合约,你会重复做大量的操作,比如编译源码为字节码和abi,部署到网络,测试然后部署合约等等。你也许希望更关注于你想要实现的东西。
Truffle和Embark框架,标准化和自动化了这些琐碎的工作。它们提供了一个好的开发,部署,以及更为重要的,测试智能合约的体验。
你可以通过官方文档来开启使用Truffle的旅程。
可以参考:基于以太坊开发第一个去中心化应用——宠物商店。
Embark(https://github.com/embark-framework/embark)提供了类似的,帮助开发者组织工程的稍有些不同的工具。
当你一开始接触智能合约这块时,应该尽量不要使用框架。直到你明白了使用框架能带来的价值时,才应该开始使用,正如你不应该通过rails new来学习HTML语言一样。
八、ETHPM
分享是关心,所以ETHPM是一个去中心化的智能合约包管理资源库(https://www.ethpm.com/registry)。使用ETHPM,你可以关联或连接到某个著名的合约或库,减少代码重复,尽可能理想的为未来的开发提供好的基础。
这里的这个规范(https://github.com/ethereum/EIPs/issues/190),详细的说明了相关的信息以及背景。Truffle和Embark均可与之集成,并创造一个愉快的开发体验。