@xiaoxiaowang
2019-01-14T13:14:43.000000Z
字数 5155
阅读 1101
以太坊最初由 Vitalik Buterin 在2013年提出。Vitalik 本是一名参与比特币社群的程序员,曾向比特币核心开发人员主张比特币平台应该要有个更完善的编程语言让人开发程序,但未得到他们的同意,因此决定开发一个新的平台作此用途。Buterin 认为很多程序都可以用类似比特币的原理来达成进一步的发展。Buterin在2013年写下了《以太坊白皮书》本人的视频解说,说明了建造去中心化程序的目标。然后2014年透过网络公开募资得到开发的资金,投资人用比特币向基金会购买以太币。
最初以太坊程序是由一间位在瑞士的公司 Ethereum Switzerland GmbH 开发,之后转移至一个非营利机构“以太坊基金会”(Ethereum Foundation)。
在平台开始发展的最初,有人称赞以太坊的科技创新,但也有人质疑其安全和可扩展性。
以太坊,Ethereum是一个分布式的计算机,有许多的节点,其中的每一个节点,都会执行字节码(其实就是智能合约),然后把结果存在区块链上。由于整个网络是分布式的,且应用就是一个个的状态组成,存储了状态就有了服务;所以它就能永不停机,没有一个中心化的结点(没有任何一个节点说了算,去中心化的),任何第三方不能干预。
举例:如果程序员需要开发一个区块链应用,就好比这个程序员要开发一款APP程序,但这时候IOS系统都不存在。于是这个程序员就先要开发一个IOS系统,然后再在这个IOS系统上去开发一个APP程序。也就是说在以太坊还没有发布之前,开发一个区块链的流程会非常漫长,难度也会非常大。但以太坊的出现就好比已经开发完成了一个非常成熟的IOS系统,它的系统向所有区块链的开发人员都开源,后续开发人员可以在以太坊开发的底层技术上十分便捷的开发新的区块链应用。
自最初版本以来,以太坊网络成功进行了数次硬分叉。
调整了未来挖矿的,确保未来的用户会有转换至权益证明的动机。
2016年春季进行了第二次分叉,发布了第一个稳定版本,称作“家园”(Homestead)。
2016年六月,以太坊上的一个去中心化自治组织 The DAO(decentralized autonomous organization,"去中心化自治组织") 被骇,造成市值五千万美元的以太币被移动到只有该黑客可以控制的“分身DAO”。因为程序不允许黑客立即提取这些以太币,以太坊用户有时间讨论如何处理此事,考虑的方案包括取回以太币和关闭DAO,而DAO去中心化的本质也表示没有中央权力可以立即反应,而需要用户的共识。最后在2016年7月20日,以太坊进行硬分叉,作出一个向后不兼容的改变,让所有的以太币(包括被移动的)回归原处,而不接受此改变的区块链则成为古典以太坊(Ethereum Classic)。这是第一次有主流区块链为了补偿投资人,而透过分叉来更动交易记录。
在这次分叉之后,造成了在两个区块链之间进行重放攻击的可能,加上其他网络攻击,让以太坊和古典以太坊又各自进行了数次分叉来避免攻击。
2016年11月底进行了第四次的分叉。这次分叉为区块链减重(de-bloat),并加入一些避免网络攻击的设计。因为沟通疏失,这次分叉短暂造成以太坊的两个主要客户端程序 Parity 和 Geth 失去共识而产生意外的分叉,但问题在数小时内即被找出并修正。
以太坊区块链上的代币称为以太币(Ether),代码为ETH,可在许多加密货币的外汇市场上交易,它也是以太坊上用来支付交易手续费和运算服务的介质 。
以太币对其他实体货币的汇率可能在短时间内大幅变化,例如 The DAO 被骇时,对美元的汇率从 15。
Buterin 在 2016 年 4 月售出手上持有的四分之一以太币,造成一些人质疑,而他本人则说这是理财上很合理的分散风险,并引用前比特币开发员 Gavin Andresen 说这一切都还只是一场实验,仍有失败的可能。
智能合约与平时的代码其实没有什么区别,只是运行于一个以太坊这样的分布式平台上而已。这个运行的平台,赋予了这些代码不可变,确定性,分布式和可自校验状态等特点。代码运行过程中状态的存储,是不可变的。每一个人,都可以开一个自己的节点,重放整个区块链,将会获得同样的结果(共识);
在以太坊中,每个合约都有一个唯一的地址来标识它自己(由创建者的哈希地址和曾经发送过的交易的数量推算出来)。客户端可以与这个地址进行交互,可以发送ether,调用函数,查询当前的状态等。
智能合约,本质上来说就是代码,以及代码运行后存储到区块链上的状态两个元素组成。
比如,你用来收发ETH的钱包,本质上就是一个智能合约,只是外面套了一个界面。
概念非常强大,相关的新闻经常提到这个非常有潜力,提到资产/权利管理,分权自治组织(DAO),身份,社交网络等炫酷。但他本质就是这些。
智能合约,就是一些代码,运行整个分布式网络中。由于网络中的每一个节点都是一个全节点。这样的好处是容错性强,坏处是效率低,消耗资源与时间(原来只在一个节点执行一次就行,现在所有节点中每一个,都要执行一模一样的运算)。因为执行计算要花钱,而要执行的运算量与代码直接相关。所以,每个在网络运行的底层操作都需要一定量的gas。gas只是一个名字,它代表的是执行所需要花费的成本(由于以太坊是图灵完备的,随便一个死循环就将导致网络不可用,所以引入了gas的概念)。整个分布式网络引入了强制限制,来避免停机问题。因此如果你写一个死循环,当gas耗尽后,网络就会拒绝执行接下来的操作,并且回滚你之前的所有操作。
gas的价格由市场决定,类似于比特币的交易费机制。如果你的gas价格高,节点则将优先因为利益问题打包你的交易。
一般来说,在Ethereum中计算和存储东西比在传统环境中做的更为昂贵,但是,Ethereum为您的代码提供了上述我们讨论过的那些好的属性,这可能是一样有价值的。
一般来说,在以太坊网上读取状态是免费的,只有写入状态是收费的。下面这个文章是gas概念的一些深度解析。
链接:https://www.zhihu.com/question/267769437/answer/329466721
Geth是典型的开发以太坊时使用的客户端,基于Go语言开发。 Geth提供了一个交互式命令控制台,通过命令控制台中包含了以太坊的各种功能(API)
Mist、Parity、MyEtherWallet、imToken、MetaMask、Legder
友情链接:https://ethfans.org/posts/introduction-to-6-ethereum-wallet
智能合约的官方推荐的编程语言是Solidity,文件扩展名以.sol结尾。
Solidity语言和JavaScript很相似,用它来开发合约并编译成以太坊虚拟机字节代码
Viper,Serpent,LLL及Bamboo
友情链接:https://solidity-cn.readthedocs.io/zh/develop/index.html
官方文档:https://solidity.readthedocs.io/en/v0.5.2/
https://remix.ethereum.org/
- 运行环境:EVM
EVM(Ethereum Virtual Machine)以太坊虚拟机是以太坊中智能合约的运行环境
Solidity之于EVM,就像之于跟JVM的关系一样,这样大家就容易理解了。
以太坊虚拟机是一个隔离的环境,外部无法接触到在EVM内部运行的代码
而EVM运行在以太坊节点上,当我们把合约部署到以太坊网络上之后,合约就可以在以太坊网络中运行了。
以太坊虚拟机上运行的是合约的字节码形式,需要我们在部署之前先对合约进行编译,可以选择Remix或solc编译器。
智能合约的部署是指把合约字节码发布到区块链上,并使用一个特定的地址来标示这个合约,这个地址称为合约账户.
合约部署之后,当需要调用这个智能合约的方法时只需要向这个合约账户发送消息(交易)即可,通过消息触发后智能合约的代码就会在EVM中执行了。
Mac
brew tap ethereum/ethereum
brew install ethereum
其他平台的参考:https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum
{
"config": {
"chainId": 1000,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
初始化脚本
geth --datadir ./data init genesis.json
启动客户端
geth --datadir ./data --networkid 1000 --port 30303 --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi 'db,net,eth,web3,personal' --rpccorsd omain '*' --nat "any" --identity "wangxc" console 2> 1.log
networkid对应chainId
基本命令
eth.accounts
personal.newAccount("123") #里面是密码
eth.getBalance(eth.accounts[0])
personal.unlockAccount(eth.accounts[0])
miner.start(threadnum)
miner.stop()
acc0 = eth.accounts[0]
eth.sendTransaction({ from:acc0,to:acc1,value:web3.toWei(11,"ether") })
pragma solidity ^0.4.25;
contract hello {
address greeting;
constructor (address _greeting) public {
greeting = _greeting;
}
function say() public returns (string){
if(msg.sender == greeting){
return "i am contract creator!!!";
}else{
return "i am guester!!!";
}
}
}
注意版本号的区别
remix提供的虚拟机
Ropsten Test Network
私链
以太坊JSON RPC API介绍 http://orchome.com/958
ETHGlobal 2018 wrap-up, and looking ahead to 2019(ETHGlobal 2018总结,展望2019年): https://medium.com/ethglobal/ethglobal-2018-wrap-up-and-looking-ahead-to-2019-d9676e141eca