以太坊开发入门,完整入门

2023-11-17

翻译自:https://medium.com/@mattcondon/getting-up-to-speed-on-ethereum-63ed28821bbe


从入门到精通,干货篇。


必读,如果你:


  • 是一个专业的程序员

  • 如果你想了解以太坊当前可以做到什么程度,通过什么,如何做到。


预备知识:


    1. 你需要知道区块链的概念及实现一个无需信任的电子货币的运作原理。可以先看看长版(https://www.youtube.com/watch?v=bBC-nXj3Ng4),如果你觉得太长,可以看看短版(https://www.youtube.com/watch?v=l9jOJk30eQs)。但我还是建议,看那个长的视频。

    2. 如果你是一名软件工程师,拥有软件开发的经验。能知道从系统、架构角度学一个东西,其实能倍增学习效果。

    3. 如果有一周的空闲时间。好了,下面开始就不再是废话了。

    4. 你需要了解merkle tree(https://en.wikipedia.org/wiki/Merkle_tree)的基本概念,看他是如何做到防止信息篡改,以及信息自校验的(译者注:可以看我曾经翻译的以太坊官方的关于merkle tree的文章,http://me.tryblockchain.org/Ethereum-MerklePatriciaTree.html )。


不用必须读白皮书,只需要了解一些基本概念。但说实话,如果不读,不会相信这些概念,从而不能真正明白这些概念,所以读白皮书也许仍然是最快的方式。


我建议你完整的读一下本文,从一个较高的层面了解一下,然后再挑感兴趣的,一一钻研,也许要花几天时间哦。


你最后会发现,区块链就是建立在朴实无华的基本技术之上,一点也不神奇。虽然最近各种ICO把它炒得非常热。每个人都是站在巨人的肩膀上,如果你是程序员,你能对这些项目和技术,理解得更深。所以不要因为其它一些糟粕,而失去了一个提升自己的机会。


以太坊


以太坊,Ethereum(https://www.ethereum.org/)是一个分布式的计算机,有许多的节点,其中的每一个节点,都会执行字节码(其实就是智能合约),然后把结果存在区块链上。由于整个网络是分布式的,且应用就是一个个的状态组成,存储了状态就有了服务;所以它就能永不停机,没有一个中心化的结点(没有任何一个节点说了算,去中心化的),任何第三方不能干预。


显然上面这一段话,直接解释了以太坊是什么。但你可能有非常多的问题。可以先读一下以太坊的白皮书(https://github.com/ethereum/wiki/wiki/White-Paper)。或者看下这个视频,25分钟理解以太坊(https://www.youtube.com/watch?v=66SaEDzlmP4)。(译者注:以太坊入门,确实没有什么好的办法,就是看白皮书最好,最快)


智能合约


智能合约与平时的代码其实没有什么区别,只是运行于一个以太坊这样的分布式平台上而已。这个运行的平台,赋予了这些代码不可变,确定性,分布式和可自校验状态等特点。代码运行过程中状态的存储,是不可变的。每一个人,都可以开一个自己的节点,重放整个区块链,将会获得同样的结果(译者注:能控制所有节点都达到一致状态,就是所谓的共识)。


在以太坊中,每个合约都有一个唯一的地址来标识它自己(由创建者的哈希地址和曾经发送过的交易的数量推算出来)。客户端可以与这个地址进行交互,可以发送ether,调用函数,查询当前的状态等。


智能合约,本质上来说就是代码,以及代码运行后存储到区块链上的状态两个元素组成。比如,你用来收发ETH的钱包,本质上就是一个智能合约,只是外面套了一个界面。


概念非常强大,而我相信你已经看完了。而你在看相关的新闻,经常听到这个非常有潜力,经常听到资产/权利管理,分权自治组织(DAO),身份,社交网络等炫酷。但他本质就是这些。


Gas


智能合约,就是一些代码,运行整个分布式网络中。由于网络中的每一个节点都是一个全节点。这样的好处是容错性强,坏处是效率低,消耗资源与时间(译者注:原来只在一个节点执行一次就行,现在所有节点中每一个,都要执行一模一样的运算)。因为执行计算要花钱,而要执行的运算量与代码直接相关。所以,每个在网络运行的底层操作都需要一定量的gasgas只是一个名字,它代表的是执行所需要花费的成本(译者注:由于以太坊是图灵完备的,随便一个死循环就将导致网络不可用,所以引入了gas的概念)。整个分布式网络引入了强制限制,来避免停机问题(https://en.wikipedia.org/wiki/Halting_problem)。因此如果你写一个死循环,当gas耗尽后,网络就会拒绝执行接下来的操作,并且回滚你之前的所有操作。


gas的价格由市场决定,类似于比特币的交易费机制。如果你的gas价格高,节点则将优先因为利益问题打包你的交易。


一般来说,在Ethereum中计算和存储东西比在传统环境中做的更为昂贵,但是,Ethereum为您的代码提供了上述我们讨论过的那些好的属性,这可能是一样有价值的。


一般来说,在以太坊网上读取状态是免费的,只有写入状态是收费的。下面这个文章是gas概念的一些深度解析(https://hackernoon.com/ether-purchase-power-df40a38c5a2f)。


分布式APP(ĐApp / Dapp / dapp/ dApp)


一个分布式App是指,服务端运行于以太坊网络上一个或多个智能合约。


一个分布式的App不用将所有状态都存储在区块链上,或者在链上进行所有计算(译者注:比如图形渲染),这样就太花gas了。所以一个分布式App把需要大家共同信任的状态存在区块链上就好了。许多的分布式应用使用后面提到的技术,如IPFS和Gelem,在链下进行分布式存储和计算。虽然没在以太坊上,但仍使用的是区块链技术。


我不知道谁开始在D上使用这个小小的缺点,是看起来酷,但会影响搜索。 你可以自由使用,但尽量方便别人的搜索。


以太坊的github上,有一个dapp-bin的目录(https://github.com/ethereum/dapp-bin),有一些文档和示例。使用前,你需要看看文件最近的状态,因为他们将很可能已经被淘汰。


DApp客户端


大多数的分布式应用都通过一些用户友好的前端提供服务,因为不是所有人都愿意通过命令行,通过自己手动组装哈希串和操作指令码进行交易。


一个DApp与传统的开发中的,客户端或前端是类似,区别仅在于它们与以太坊的区块链进行交互(也可以同时与其它服务交互)。这些客户端往往用JS编写,因为当前还暂时没有完成全部的向NodeJS的转换。


另外,大多数的Dapp客户端使用JS的原因,是因为它可以在浏览器中运行,因为大家都有浏览器,这样每个人都可以运行了。由于有更多的go语言的开发工具,使用go语言来写客户端的也不少。在现在这个激烈的发展期,这意味着,除非你有自己的偏好,否则可能要从go和JS(也许还有,Rust)来选择一种语言,来与以太坊区块链,以及基于以太坊开发的协议进行交互了。


以太坊的一个核心开发者,写了一篇关于使用Meteor工具来创建Dapp的文章(https://github.com/ethereum/wiki/wiki/Dapp-using-Meteor),这意味着Meteor已经成为Dapp客户端开发的新标准。这绝对是基于JS建立全栈应用时的一个首选方法。但需要注意的是Meteor只是提供了一个开发工具,与DApp客户端并不等同,DApp客户端也完全可以由其它方式开发。(译者注:还有一些其它的开发工具,如Truffle,也是非常不错的哦)。


因为围绕Meteor和DApp开发的活跃,有非常多的包在Atmophere(Meteor的包管理工具),它提供了许多常见的操作,如帐户管理,从区块链中获得最新的50个区块等等。


DApp浏览器


一个DApp浏览器,正如它字面所表达的,用来让DApp客户端(常常使用JS与以太坊的智能合约进行交互)的使用更加容易。


DApp浏览器的主要目的是:


    1. 提供到一个以太坊节点的连接(或者连接到一个本地节点或者远程节点),和一个方便的切换不同节点(甚至是不同的网络)。

    2. 提供一个帐户(或者一个钱包)来方便用户与DApp交互。


Mist(https://github.com/ethereum/mist)是以太坊官方的DApp浏览器。一个漂亮的界面来与以太坊节点交互,与智能合约发、收交易。


Status(https://status.im/)是一个手机上可以使用的DApp浏览器。


MetaMask(https://metamask.io/)是一个Google浏览器扩展,把Chrome变成了一个DApp浏览器。它的核心特性是注入以太坊提供的js客户端库web3,到每一个界面,来让DApp连接到MetaMask提供的以太坊节点服务。不过这个Chrome扩展,可以允许你管理你的钱包,以及连接到不同的以太坊网络(译者注:包括本地的开发网络)。


Parity(https://parity.io/parity.html)是一个以太坊客户端(也是一个全节点的实现),集成到了Web浏览器,并使之成为一个DApp浏览器。


以太坊节点


与比特币的节点类似。每个节点都存储了整个区块链的数据,并重放所有的交易以验证结果的状态。你可以通过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)。


Truffle和Embark


一旦你开始写智能合约,你会重复做大量的操作,比如编译源码为字节码和abi,部署到网络,测试然后部署合约等等。你也许希望更关注于你想要实现的东西。


Truffle和Embark框架,标准化和自动化了这些琐碎的工作。它们提供了一个好的开发,部署,以及更为重要的,测试智能合约的体验。


你可以查看这个文章(http://truffleframework.com/docs/getting_started)来开启使用Truffle的旅程。


这篇文章,提供了使用Truffle来部署以及与智能合约交互的文章(https://blog.zeppelin.solutions/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05)。


Embark(https://github.com/iurimatias/embark-framework)提供了类似的,帮助开发者组织工程的稍有些不同的工具。


当你一开始接触智能合约这块时,应该尽量不要使用框架。直到你明白了使用框架能带来的价值时,才应该开始使用,正如你不应该通过rails new来学习HTML语言一样。


ETHPM


分享是关心,所以ETHPM是一个去中心化的智能合约包管理资源库(https://www.ethpm.com/registry)。使用ETHPM,你可以关联或连接到某个著名的合约或库,减少代码重复,尽可能理想的为未来的开发提供好的基础。


这里的这个规范(https://github.com/ethereum/EIPs/issues/190),详细的说明了相关的信息以及背景。Truffle和Embark均可与之集成,并创造一个愉快的开发体验。


网络


Mainnet-以太坊主网,通常是所有客户端的默认网络。


Ropsten - 以太坊使用工作量证明的主测试网络。这个网络,因为低的计算量,容易遭到DDOS攻击,分片,或者其它问题。垃圾邮件攻击后被暂时放弃,最近才恢复使用。(https://github.com/ethereum/ropsten


Kovan-parity客户端组成的测试网络,使用授权证明来提升对垃圾邮件攻击的抗扰度,并且持续4秒的阻塞时间。(https://github.com/kovan-testnet/proposal


Rinkeby-geth客户端组成的测试网络,使用集团共识,尽管计算量低,但是对恶意行为者更有弹性。(https://www.rinkeby.io/


你可以自己搭建你自己的测试网络,也许使用kubernetes(https://github.com/MaximilianMeister/kuberneteth)或者docker-compose(https://capgemini.github.io/blockchain/ethereum-docker-compose/),但也许你将很快就可以不需要花什么时间。


帐户与钱包


一个以太坊帐户就是一个私钥和公钥地址对。它们可以用来存储ether,创建时不需要花费gas。


钱包则是用来管理ether的智能合约(一些代码)。这里是使用solidity写的一个钱包,运行于Mist浏览器(https://github.com/ethereum/meteor-dapp-wallet/blob/develop/Wallet.sol)。他们可以有许多的特性,比如多用户签名,纸?等等。


这样,我们就正确的定义了两个名词,前面看到其它人对这两个术语的困惑,并把所有能存ether的都叫作Wallet。


EVM以及智能合约创建的状态


在每个全节点网络上运行的智能合约代码在EVM内执行。这是您的标准虚拟机,执行一些字节码,除了这个vm与网络,文件系统,进程等隔离。没有人想要编写字节码,所以我们有一些更高级别的语言编译为EVM字节码。


Solidity


Solidity(https://solidity.readthedocs.io/en/latest/)是第一批的描述智能合约的语言。当前是最流行的语言,因此也有最多的例子,文档,和教程。你应该学习这个,除非你有要学习其它的理由。


你可以使用基于浏览器的Remix IDE(https://ethereum.github.io/browser-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


LLL,是一门Lisp风格的底层编程语言,就像语言名称看到的这样。虽然以太坊官方并没有将它作为主要需要支持的语言,但它仍旧持续进行着更新,且与solidity在同一个资源库(https://github.com/ethereum/solidity)。


这是一个使用LLL语言写的一个ERC20代币的合约(https://github.com/benjaminion/LLL_erc20/blob/1c659e890e2b30408555b9467a8dfd8988211b3b/erc20.lll


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


Serpent(https://github.com/ethereum/serpent/tree/develop)是一个类Python的高级语言,最终也会被编译为EVM字节码。它主要被Augur团队使用。


但最近Zeppelin Solution团队发现其编译器有一个严重的bug(https://blog.zeppelin.solutions/serpent-compiler-audit-3095d1257929),在这个问题被修复之前都不建议继续使用。


如果你对Augur如何解决这些漏洞感兴趣,你可以阅读Zeppelin Solution的这篇文章(https://blog.zeppelin.solutions/augur-rep-token-critical-vulnerability-disclosure-3d8bdffd79d2)。


Serpent的合约看起来如下:


def register(key, value):
    # Key not yet claimed
    if not self.storage[key]:
        self.storage[key] = value
        return(1)
    else:
        return(0)  # Key already claimed

def ask(key):
    return(self.storage[key])


其它


在各种可用性和发展状态中还有一堆其他的高级语言,而且无疑将会被开发出来。 为了广泛采用,语言和编译器必须经过彻底的审查和测试,这当然需要时间。


智能合约反编译/Disassembly


可以通过prosity(https://github.com/comaeio/porosity)来反编译以太坊智能合约的字节码,可以使用evmdis(https://github.com/Arachnid/evmdis)来Disassembly。


智能合约的安全


一旦一个智能合约部署到了以太坊的网络上,它将是永不可变的,且将永久存在。如果你写了一个bug,你将不能下架这个有问题的版本,你只能在后续的版本中修复。


由于许多工程师开发的Ethereum和其他智能合同平台来自于Web开发,所以这个概念实在是太新,而且是疯狂的。


ConsenSys有一个非常棒的资源叫智能合约的最佳实践(https://github.com/ConsenSys/smart-contract-best-practices),你应该深入的理解一下。


一个Parity的钱包被黑的解释(https://blog.zeppelin.solutions/on-the-parity-wallet-multisig-hack-405a8c12e8f7)。


在你部署你的智能合约的时候,由于你管理的是真正的资金,你应该先开一个赏金计划(https://blog.zeppelin.solutions/setting-up-a-bug-bounty-smart-contract-with-openzeppelin-a0e56434ad0e),并尽量保证它完整的测试过。


Whisper


Whisper(https://github.com/ethereum/go-ethereum/wiki/Whisper-Overview)是一个集成进以太坊的消息系统。它允许DApp发布小量的信息来进行非实时的消息通信。


它使用shh协议。


尽管它已经有段时间没有更新了,这是一个使用Whisper协议实现一个聊天客户端的例子(https://github.com/ethereum/meteor-dapp-whisper-chat-client)。


去中心自动化组织(DAOs)


这是一个组织(就像,一群人),其中,使用代码来保证最终的强制执行,而不是使用传统的法律文件。这群人使用智能合约来做常见组织做的所有的事情,比如在某件事上进行投票,比如决定是否对什么进行投资等等。


副作用是决策,管理,以及对什么进行投资的结果将会不可改变的存储在区块链上。


之前slock.it创建了标准的DAO框架来说明这个理念。在这里(https://github.com/slockit/DAO/)有对DAO概念的总览,以及如何使用框架来实现一个自己的DAO(译者注:这个项目由于bug被黑客攻击了)。


Aragon


Aragon(https://aragon.one/)也正在应对挑战,设计一个根据智能合约逻辑运作的公司,重点是创建一个可以接受投资,处理会计,支付雇员,分配股权,正如我们现在知道的完成每天的公司的业务。他们也实现了漂亮的DApp客户端来让他们的协议使用起来更为简单。


查看这里Aragon核心合约(https://github.com/aragon/aragon-core/tree/master/contracts)来更多的理解它是如何做的。


IPFS&FileCoin


IPFS(https://ipfs.io/)(星际文件系统)是一个协议,用来分发文件。你可以认为它是一个基于bittorrentgit这样概念的一个文件系统,文件可以定位,且是不可变的。IPFS以IPLD(http://ipld.io/)数据模型存储信息,它非常有趣,提供了一些特别的特性,你可以通过下面的说明了解一些。


这是一个新的协议,它有一个http的网关和文件系统适配器,这让你可以通过http,挂载整个互联网文件系统到你本地的盘/ipfs。IPFS还提供了一个寻址服务IPNS(星际命名空间),它允许可变的状态(需要注意的是在IPFS里的所有东西都是不可变的)。你甚至可以使用DNS TXT记录来定位到你的IPNS客户端,允许你生成用户友好的链接来指向到对应的数据。


FileCoin(https://filecoin.io/)是Protocol Lab为创建一个去中心化的基于IPFS的存储市场的努力结果,也就是向整个网络提供存储资源的激励层。FileCoin的共识协议没有使用浪费资源的工作量证明,而是使用了Proff of ReplicationProof of SpaceTime来保证每片数据被复制某个特定的拷贝数量且存储某个特定的时间。


你应该读一下IPFS的白皮书(https://github.com/ipfs/ipfs/blob/master/papers/ipfs-cap2pfs/ipfs-p2p-file-system.pdf),FileCoin的白皮书(https://filecoin.io/filecoin.pdf),以及IPLD的规范(https://github.com/ipld/specs/tree/master/ipld)。


由于当前FileCoin还没有上线,你可以使用当前的IPFS存储网络来运行html/css/js,并把作为一个类似orbit-db(https://github.com/orbitdb/orbit-db)的数据库。


Swarm


Swarm是一个去中心化的存储网络,集成于以太坊生态系统,作为第一阵营的项目,看看这里关于IPFS与这个项目的比较和优劣(https://github.com/ethersphere/go-ethereum/wiki/IPFS-&-SWARM)。但本质上,基本上是一样的,除了它们有不同的哲学,并在底层使用稍微不同的协议。


项目


Augur


Augur(https://augur.net/)是一个去中心化的预测市场,让大家对于某个现实世界的事件进行对赌。一方面,用户在某个具体可以发生的事件上投注,一旦结果成真,它们赢得的代币有真正的价值。为了实现这个,你需要实现一个去中心化的先知协议,来输入现实世界中的信息,它使用REP协议代币来进行经济激励(http://blog.augur.net/guide-to-augurs-rep/)。


你可以看看Augur项目的合约代码(https://github.com/AugurProject/augur-core),以及了解下Augur Master Plan(https://medium.com/@AugurProject/augur-master-plan-42dda65a3e3d)。


Gnosis


Gnosis(https://gnosis.pm/)与Augur有类似的理念,也是一个去中心化的预测市场。这是项目的白皮书(https://gnosis.pm/resources/default/pdf/gnosis_whitepaper.pdf),以及与Augur项目的对比(https://medium.com/@akhounov/hopefully-impartial-comparison-of-gnosis-and-augur-f743d11d6d37)。


Golem


Golem(https://golem.network/)是一个分布式的算力市场,以与IPFS一样的方式构建了一整套的提供算力市场。


你可以看看FAQ(https://github.com/golemfactory/golem/wiki/FAQ)来更好的理解。


0xProject


0xProject创建了一个交换代币的协议,以及一个DApp来实现这个协议。开发者可以创建一个基于它们自己的分布式应用创建交易所(技术上叫中继层),而用户也不用信任这些app就可完成交易,结算在区块链上完成。0x协议旨在使用离线的第三方来广播交易和管理订单(可以创建/更新/删除订单,而不用直接向Ethereum发送缓慢/昂贵的交易),但最终会使用Ethereum进行结算。


它们实现了场外交易(https://blog.0xproject.com/announcing-0x-otc-5db58dc9ba8),一个DApp使用这个协议来在用户之间直接交换代币。你可以在github上查看他们的合约(https://github.com/0xProject/contracts)。


你还可以跳过这些酷炫的概念,直接阅读FAQ(https://0xproject.com/faq)。


Swap


ConsenSys的Swap(https://swap.tech/)协议也是非常类似的,但更专注于p2p的直接交易(而不是基于订单表),这里有一个白皮书,可以看看(https://swap.tech/pdfs/SwapWhitepaper.pdf),这里有一个关于Swap协议的介绍(https://media.consensys.net/introducing-swap-a-protocol-for-decentralized-peer-to-peer-trading-on-the-ethereum-blockchain-d4058f3179cf)。


Bancor


代币的流动性是相对来说在加密币的生态中是一个非常大的问题。在用户间的交易需要满足买方和卖方两边的想法。


Bancor(https://www.bancor.network/)是一个协议,可以让你的代币1)可以根据订单自动给予价格2)可以通过持有其它的代币作为抵押器来即时创造流动性。


查看这里的白皮书(https://www.bancor.network/static/bancor_protocol_whitepaper_en.pdf


Makerdao & Dai


以太坊区块链管理的代币价值往往会有巨大的波动。这个特性在现实生活中则非常不好,比如你的目标是用来保值。


Maker DAO(https://makerdao.com/)是一个DAO来管理Dai稳定币(https://github.com/makerdao/docs/blob/master/Dai.md)。Dai现在还不存在,但他们已经发布了一个alpha的版本叫Sai(https://blog.makerdao.com/2017/06/05/introducing-sai/)来展示这门技术。


这里是DAI的白皮书(https://github.com/makerdao/docs/blob/master/Dai.md)。


Oraclize


如果我们要向智能合约中输入一些信息,比如纽约今天的天气,我也许需要实现一个去中心化的先知协议询问一批人(花费高且慢),但如果写一个服务以中心化的方式来提供信息,又违背了去中心化应用的理念。


Oraclize(http://docs.oraclize.it/#background)尝试用以下方式来解决问题1)从一个外部数据源向你的智能合约发送数据。2)提供一个证明,数据来自某个数据源,且没有被修改过。由此如果你信任random.org,你可以使用Oraclize来提供一个随机数生成合约。


他们的集成非常强大; 您可以获取URL,解析JSON和XPATH,查询Wolfram Alpha等。


BTCRelay


BTCRelay(http://btcrelay.org/)作为比特币区块链交易的先知机制,这意味着你可以在以太坊上编写智能合约来响应比特币区块链上的某个交易,进行触发后续的操作。比如,你可以让人通过BTC为你的服务付费,使用BTCRelay在以太坊上校验付款成功后,继而在以太坊上提供对应的服务。


Open Zeppelin & zeppelinOS


Zeppelin Solutions是一个科技公司,在这个领域内正完成一些伟大,而且专业的事。它们实在做了太多事,太难一一说清了。


他们管理了Open Zeppelin(https://openzeppelin.org/),一系列经过审查的,最佳的智能合约实践,你可以继承并应用于你自己的DApp中。你可以查看他们的github资源来学习更多(https://github.com/OpenZeppelin/zeppelin-solidity)。你应该读一下里面的每一个合约。


他们坚持代码复用的理念,然后进一步创建了Zeppelin OS(https://blog.zeppelin.solutions/introducing-zeppelinos-the-operating-system-for-smart-contract-applications-82b042514aa8)。你可以忽略OS,它不是传统意义上的操作系统的概念。zeppelinOS特性,工具和服务的集合,旨在提供稳固的开发人员体验,同时最大限度地提高智能合同安全性。


zeppelinOS中的其中一部分是“zeppelinOS Kernel”。其实他们不是传统意义上的核心,而且是一组库(https://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736)。它们是通过库模型实现的可升级的智能合约(https://blog.zeppelin.solutions/proxy-libraries-in-solidity-79fbe4b970fd),可以在出现安全问题时独立的进行更新。因为你在合约内包含的代码更少,部署也将花费更少的gas,而开发者也减少了代码的重复。


zeppelinOS还有一些其他整齐的规划,比如调度程序(智能合约的异步执行,因为默认合同一般不会主动触发某个行为),市场级的协议和链下开发者体验工具。


ENS - 以太坊的命名服务


ENS(https://ens.domains/)是一个去中心化的名称注册服务。并有一个描述性的项目名称。


BAT 基础注意力代币 & Brave浏览器


BAT(https://basicattentiontoken.org/)尝试去中心化广告系统,通过监控大家的注意力,并在内容提供商,广告商和用户之间分发收益,切掉中间人。


Brave和BAT由JS创始人Brendan Eich创建,同时他也是Mozilla的联合创始人。


uPort


uPort(https://www.uport.me/)在解决去中心化的身份识别问题。


district0x


district0x(https://district0x.io/)是一个更高层级的去中心化的市场和社区。核心是通过一系列的智能合约来管理用户发布信息,搜索,过滤信息,在社区内维护信誉,管理支付等等。它可以用来建议如Ethlance(https://ethlance.com/)和NameBazaar(https://namebazaar.io/)这样的市场。


他们有非常棒的视觉设计。


Steem


Steem(https://steemit.com/)是区块链上的reddit,它使用协议代币(STEEM)来激励这个社交社区的参与度。


在这里查看白皮书(https://steem.io/SteemWhitePaper.pdf)。


有一些关于Steemit块链如何启动以及支持组织如何运作的反应(https://medium.com/m/global-identity?redirectUrl=https://decentralize.today/the-ugly-truth-behind-steemit-1a525f5e156)。


参与者与领域内的玩家


ConsenSys


ConsenSys(有点像共识Consensus,但作为一个公司名称;它很聪明,巧妙的把u改成了s,但我一般念为“con-SEn-SIS”,避免读错)是一个“风险投资和产品工作室”。他们是一个(其实非常大)伞形组织,它赞助了一大堆项目(https://consensys.net/ventures/spokes/)和核心组件(https://consensys.net/ventures/core-components/)的开发。值得一提的是,它们资助了Truffle,Infura,MetaMask,Gnosis和uPort。


Zeppelin Solutions


Zeppelin Solutions(https://zeppelin.solutions/)在上面我们有提到过,他也审查智能合约代码,提供咨询服务。他们的博客质量相当高(https://blog.zeppelin.solutions/)。


Protocol Labs


Protocol Labs(https://protocol.ai/)是一群让人印象深刻的人,致力于IPFS,FileCoin,lip2p以及IPLD等其它项目的开发。


区块链资本概况


Etienne Brunet(https://medium.com/@etiennebr)有一篇关于代币,ICO和VC的概况文章(https://medium.com/@etiennebr/my-token-ico-blockchain-capital-markets-landscape-617e6ff1eae1)。


社区


你可以加入以太坊的社区(https://medium.com/blockchannel/where-can-i-join-the-ethereum-community-3aa5c795b1e5)。


未来


未来展望(https://media.consensys.net/interplanetary-linked-computing-separating-merkle-computing-from-blockchain-computational-courts-1ade201ecf8a)。


出处:http://me.tryblockchain.org/getting-up-to-speed-on-ethereum.html


版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。



架构文摘

ID:ArchDigest

互联网应用架构丨架构技术丨大型网站丨大数据丨机器学习

更多精彩文章,请点击下方:阅读原文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以太坊开发入门,完整入门 的相关文章

  • 如何在 Ubuntu 18.04 上安装和保护 Grafana

    笔者精选 dev 颜色接受捐赠作为为捐款而写程序 介绍 Grafana是一个开源数据可视化和监控工具 集成了来自以下来源的复杂数据普罗米修斯 InfluxDB Graphite and 弹性搜索 Grafana 允许您为数据创建警报 通知和
  • Mockito 模拟静态方法 - PowerMock

    Mockito 允许我们创建模拟对象 由于静态方法属于类 因此 Mockito 中无法模拟静态方法 但是 我们可以使用 PowerMock 和 Mockito 框架来模拟静态方法 使用 PowerMock 的 Mockito 模拟静态方法
  • 如何在 Ubuntu 22.04 上使用 Nginx-RTMP 设置视频流服务器

    介绍 流媒体视频有很多用例 服务提供商如Twitch在处理流媒体的网络发现和社区管理方面非常受欢迎 并且免费软件 例如OBS工作室广泛用于实时组合来自多个不同流源的视频叠加 虽然这些平台非常强大 但在某些情况下 您可能希望能够托管不依赖其他
  • 如何在 Debian 11 上安装 MariaDB

    介绍 MariaDB是一个开源关系数据库管理系统 通常用作 MySQL 的替代品 作为流行的数据库部分LAMP Linux Apache MySQL PHP Python Perl 堆栈 它旨在成为 MySQL 的直接替代品 本安装指南的简
  • 如何在 Ubuntu 18.04 上使用 LEMP 安装 WordPress

    介绍 WordPress 是互联网上最流行的 CMS 内容管理系统 它允许您在具有 PHP 处理功能的 MySQL 后端上轻松设置灵活的博客和网站 WordPress 得到了令人难以置信的采用 是快速启动和运行网站的绝佳选择 设置完成后 几
  • 从 Python 列表中获取唯一值

    在这篇文章中 我们将了解从 Python 列表中获取唯一值的 3 种方法 在处理大量原始数据时 我们经常遇到需要从原始输入数据集中提取唯一且不重复的数据集的情况 下面列出的方法将帮助您解决这个问题 让我们开始吧 在 Python 中从列表中
  • 如何在 Ubuntu 14.04 上安装 MySQL

    介绍 MySQL是一个开源数据库管理系统 通常作为流行的一部分安装LAMP Linux Apache MySQL PHP Python Perl 堆栈 它使用关系数据库和 SQL 结构化查询语言 来管理其数据 简短版本的安装很简单 更新您的
  • 如何在 Ubuntu 12.04 上设置 vsftpd

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • 图像处理第 5 部分:算术、按位和掩码

    在图像处理系列的第五部分中 我们将详细讨论 Python 中的算术和位运算以及图像掩码 建议以前的文章在开始您的蒙面学习冒险之前 请先完成一遍 设置环境 以下代码行用于下面给出的所有应用程序 我们将把它们包含在这里 这样您就不必阅读大量代码
  • 计算机网络(五)传输层详解

    目录 第五章 传输层 5 1 传输层概述 进程之间的通信 网络层与传输层的区别 传输层的两个主要协议 传输层的端口 TCP IP传输层端口 5 2 UDP UDP需要实现的功能 UDP提供的服务 UDP适合哪些应用 UDP协议的特点 UDP
  • 华为OD机试真题(Java),吃到最多的刚好合适的菜(100%通过+复盘思路)

    一 题目描述 入职后 导师会请你吃饭 你选择了火锅 火锅里会在不同时间下很多菜 不同食材要煮不同的时间 才能变得刚好合适 你希望吃到最多的刚好合适的菜 但你的手速不够快 用m代表手速 每次下手捞菜后至少要过m庙才能在捞 每次只能捞一个 那么
  • umijs + dva + request + js-cookie实现登录

    umijs dva umi request js cookie实现登录 一 在src下创建models文件夹 创建user ts 二 在pages下创建login文件下 组件使用函数创建 三 创建cookie管理文件 和request ts
  • 阿里云dataworks就是个半成品!

    用hadoop EMR 不要用dataworks 不要用dataworks 不要用dataworks 重要的事情说三遍 各种莫名其妙的坑 ip黑盒 工程师无法干涉 傻瓜式无限的提交 发布 点来点去浪费时间 各种bug fuxi错误 完全没有
  • (2023,网络修剪)探索 few-shot 图像生成中的不相容知识迁移

    Exploring Incompatible Knowledge Transfer in Few shot Image Generation 公众号 EDPJ 目录 0 摘要 1 简介 2 相关工作 3 基础 4 FSIG 中不兼容的知识转
  • Mac之zip unzip 命令(压缩)

    https blog csdn net yxys01 article details 73848720 最通俗的用法 zip q r e m o myfile zip someThing 1 q 表示不显示压缩进度状态 r 表示子目录子文件
  • 记录自己开发入职第一天需要干的事情

    拉取代码前的准备工作 安装JDK 数据库本地可视化客户端 如Navicat SQLyog DBeaver Workbench Windows连接linux终端工具 Xshell SecureCRT Putty 下载IDEA 配置IDEA开发
  • adb shell 获取手机分辨率

    使用adb修改屏幕像素密度 此命令针对全志开发板子 adb shell am display density 120 以下命令针对高通的开发板子 获取Android设备屏幕分辨率 adb shell wm size获取android设备屏幕
  • Tomcat简介及优化思路

    Tomcat 处理请求大致流程和架构 请求流程 1 HTTP服务器会把请求信息使 ServletRequest对象封装起来 2 进 步去调 Servlet容器中某个具体的Servlet 3 在 2中 Servlet容器拿到请求后 根据URL
  • 超分辨率重建测试(DASR)

    测试链接 GitHub LongguangWang DASR CVPR 2021 Unsupervised Degradation Representation Learning for Blind Super Resolutionhttp
  • vue3项目实战---知乎日报----项目搭建

    目录 基础框架和响应式布局 项目介绍 接口文档 vue config pagejson 初始化公共样式 vuex模块 路由模块 utils公共类库 axios 二次封装 响应式处理 vant ui组件库 基础框架和响应式布局 项目介绍 知乎

随机推荐

  • 基于VMWare 16虚拟机 CentOS7linux系统SFTP服务器的搭建与数据上载传输

    文章目录 写在前面 1 SFTP协议 2 SFTP服务器搭建 2 1 windows中SFTP服务器搭建 2 2 linux系统的SFTP服务器搭建 2 2 1 通过su命令 进入管理员权限 2 2 2 创建sftp组 2 2 3 创建一个
  • Vulnhub-DC-1实战靶场

    目录 前言 一 环境搭建 1 准备工具 2 靶场准备 二 渗透过程 1 信息收集 探测目标IP地址 探测目标IP开放端口 网页信息收集 2 漏洞查找与利用 2 1弱口令 2 2Drupalgeddon2 3 Getshell 3 1交互式s
  • Android mtk 添加app编译进系统

    1 根目录下device 搜索devices mk find iname device mk 找出device mediatek common device mk文件添加 endif Add for mediaextractor proce
  • Maven 生成source 文件 Jar

    TOC Maven 生成source 文件 Jar Maven 生成source 文件 Jar Add maven source plugin in your pom xml file
  • win11 vmware 显示 “未能启动虚拟机“ 解决办法

    编辑虚拟机文件 xxx vmx 修改其中的一行内容 virtualHW version 18
  • jQuery操作css方法

    目录 一 jQuery可以使用css方法来修改元素样式 二 设置类的样式方法 1 添加类 2 移除类 3 切换类 三 类操作与className区别 四 显示隐藏效果 1 显示语法 2 隐藏语法 3 切换语法 五 滑动效果 1 上滑效果语法
  • sql注入之报错注入

    报错注入 报错注入在没法用union联合查询时用 但前提还是不能过滤一些关键的函数 报错注入就是利用了数据库的某些机制 人为地制造错误条件 使得查询结果能够出现在错误信息中 这里主要记录一下xpath语法错误和concat rand gro
  • 某**集团夺旗赛的一道隐写题

    解压压缩包 解压出来一个文件file 使用file命令进行查看 发现是data 010查看也无果 看到标题是logistic联想到是否与xor文件有关 遂使用工具xortool 工具在此 xortool file 选概率最大的那个 13 x
  • HDFS API操作的访问方式及JUnit测试类的使用

    HDFS API操作的访问方式 主要分为使用文件系统访问方式和URL访问方式 package com wyg hdfs import java io File import java io FileOutputStream import j
  • hive 高级分组聚合(grouping sets cube和rollup)

    1 grouping sets 1 1 select a b sum c from tbl group by a b grouping sets a b 相当于 select a b sum c from tbl group by a b
  • Python求1-100所有奇数和的方法!

    在之前的文章中 老男孩IT教育小编为大家介绍过Python的特点 优势 用途以及薪资待遇等知识 而为了帮助大家更好的掌握Python 小编将为大家讲解一些实战案例 比如 Python中如何求1 100的奇数和 接下来我们来看看吧 Pytho
  • Stable Diffusion安装教程、model导入教程以及精品promt指令

    文章目录 引言 原理 图片感知压缩 潜在扩散模型 安装 插件 插件与模型下载 常用promt关键字 交流讨论 引言 最近大火的AI作画吸引了很多人的目光 AI作画近期取得如此巨大进展的原因个人认为有很大的功劳归属于Stable Diffus
  • 读取sftp服务器上的文件内容到指定的数据库表内

    引入sftp jar依赖
  • 一些常用的公共js方法

    读者可能会觉得节流与防抖有点像 其实仔细斟酌就能发现他们的不同 节流是指对于连续触发的事件 每隔一段固定时间执行一次 只要事件持续出发就可以执行很多次 在节流里涉及的时间主要是指事件执行的间隔时间 防抖则是对连续触发的事件 只会执行一次 不
  • 从操作系统层面理解同步、异步、阻塞、非阻塞

    同步和异步描述调用者会不会主动等待函数的返回值 举个例子 public void method int result otherMethod 像上面这种形式就叫同步 result 会一直等待 otherMethod 方法执行完毕并拿到返回值
  • BMVC2022

    原文标题 Hierarchical Residual Learning Based Vector Quantized Variational Autoencoder for Image Reconstruction and Generati
  • 运行 Triton 示例

    安装 Triton Docker 镜像 在拉取镜像前 需要安装 Docker 和 NVIDIA Container Toolkit 用以下命令拉取镜像 docker pull nvcr io nvidia tritonserver
  • VTK编译方法

    VTK编译方法 VTK Group Imaging ON VTK Group MPI ON VTK Group QT ON VTK Group TK ON VTK Group Views ON VTK RENDERING BACKEND O
  • 使用layui/layuiAdmin的总结

    layui是一个前端UI框架 主要是配合JQuery使用 开始使用 首先是下载文件 然后引入css和js文件 引入之后就需要在
  • 以太坊开发入门,完整入门

    翻译自 https medium com mattcondon getting up to speed on ethereum 63ed28821bbe 从入门到精通 干货篇 必读 如果你 是一个专业的程序员 如果你想了解以太坊当前可以做到