科普 | KPCB Edge: 我们关于以太坊的一些想法
自从几个月前开发者预览发布以来,我们作为专注于区块链技术的投资者,看到有相当多的公司搭建在以太坊生态系统之上。对于那些对它不熟悉的人来说,以太坊(Ethereum)是“运行智能合约的去中心化平台”。你可以在以太坊官方网站上了解更多有关于以太坊的信息,并且在维基百科上有一个其最重要特征的总结。
我们希望通过我们最了解的方式来让大家熟悉以太坊这个平台——通过制作一些演示操作,然后看看在这个平台上我们能做些什么。在这里我们会和大家分享一些关于如何开始使用以太坊的简要说明,以及解释下为什么我们对此感到兴奋。我们还建立了一些更复杂的合约,我们将在几个星期后的文章中来讨论。
尽管以太坊还处于发展的初期阶段,但它让各种各样的应用成为可能这点让我们特别激动,而且我们也很高兴能看到在最近几个月中,开发人员开始大量运用以太坊。我们坚持认为以太坊是区块链开发工具链的一个强大补充,它使用户可以访问分布式计算资源和可变存储,这些可以抵制审查制度以及防止篡改。
这些项目也激励着我们在其他区块链(如Rootstock或Counterparty)上构建以太坊虚拟机(EVM)的替代实现。我们认为这些都是向将EVM字节码作为合约编程的常用低级语言趋同的早期迹象,但是只有时间才能验证EVM字节码是否能成为主要的合约语言,也只有时间才能验证以太坊能否成为EVM最常用的实现方式。从我们的观点来看,像这样项目的存在可以降低项目创始人在以太坊上搭建产品时所面临的平台风险。
最让我们兴奋的仍然是一小部分公司,它们通过终端用户看不见的方式,特意使用区块链作为其栈中的架构选择。从用户的角度来看,我们认为这些服务将比以往任何时候都更便宜,更快速,更安全(详细信息在我们为区块链技术投资论文发表的介绍博客中可以找到)。我们认为以太坊作为一个软件平台,显著增加了区块链技术在一个应用程序的技术栈中的潜在用途。
如果你是一个区块链技术使用公司的创始者,我们很高兴能与你进行交流。
搭建以太坊
注意:这些演示操作是在配备OS X系统的机器上编写/执行的,但是相同的指令应该无需修改并可以在Linux系统上直接使用,而在Windows系统上则需要进行微调。这些说明需要用户基本掌握什么是以太坊,区块链如何工作以及软件工程方面的知识。
请按照以下说明安装以太坊go客户端来开始使用以太坊平台。安装以太坊平台之后,你应该开始将以太坊区块链同步到你的机器上,方法是在shell中不加参数直接运行geth命令(也就是作为后台驻留程序运行,但是对于本地测试来说,我发现在交互式shell中运行这个指令也可以正常工作)。同步区块链需要相当长的一段时间;你可以通过查看后台驻留程序的每个日志消息结束处的区块数值,并将这个数值与此以太坊仪表板上的区块总数值进行比较来检查你的同步进度。这个演示的其余部分假设你正运行后台驻留程序,所以就让这个shell一直在后台打开运行。
当你正在同步区块链的时候,你可以在本地创建设置一个以太坊帐户。你将需要一些以太币(以太坊的基础支持货币)存储在本地的钱包中,以便能够部署合约。以太币是以太坊的计算货币,以“gas”为单位用于合约部署/交互,gas具有由网络设定的动态价格。目前的gas价格可以通过查看上面提到的以太坊仪表板进行查询。
在第二个shell里面,运行指令get 46 32397 46 14987 0 0 1571 0 0:00:20 0:00:09 0:00:11 3270 46 32397 46 14987 0 0 1450 0 0:00:22 0:00:10 0:00:12 3030h account new,给你的账户设置一个密码,然后记录下输出返回的以太坊地址。在以太坊官方文档中有更多关于账户创建/管理的信息。
现在你将需要使用像Poloniex或Kraken这样的交换平台购买一些以太币(如果你已经有一些比特币的话,也可以发送到这些平台并用来交换以太币),或者通过以太坊网站上描述的其他方法之一获取一些以太币,并将其发送至你本地的帐户地址。我们只需要拥有很少的一点以太币就能开始使用以太坊——下面的演示操作用0.1单位的以太币就可以很容易地完成,在写这篇博客的时候对比以太币与美元的汇率花费了差不多0.1美元。
一旦你的区块链已经完成了同步工作,可以通过根据上面给出的以太坊仪表板链接检查你的区块数量,并且你已经有一点以太币存储在你的新账户里,你可以开始部署你的第一个合约了。你可以查询你的余额,通过打开以太坊控制台;在新的shell中输入geth attach
,并运行web3.fromWei(eth.getBalance(“ACCOUNT_ADDRESS”),“ether”);
其中ACCOUNT_ADDRESS是你之前创建账户得到的地址。
geth attach
是你以太坊JavaScript控制台的进入点,它提供了一些基本的JavaScript执行环境,其中包含一些以太坊扩展。你可以在以太坊维基上找到完整的命令参考。
部署你的第一个合约
为了帮你熟悉合约部署过程,我建议你部署一个简单的Hello World合约,该合约来自于广泛使用的以太坊合约教程:
contract mortal {
/* Define variable owner of the type address*/
address owner; /* this function is executed at initialization and sets the owner of the contract */
function mortal() { owner = msg.sender; } /* Function to recover the funds on the contract */
function kill() { if (msg.sender == owner) suicide(owner); }
}contract greeter is mortal {
/* define variable greeting of the type string */
string greeting; /* this runs when the contract is executed */
function greeter(string _greeting) public {
greeting = _greeting;
} /* main function */
function greet() constant returns (string) {
return greeting;
}
}
该合约是用Solidity编程语言编写的,它是一种类Javascript的编程语言,能够编译为可在以太坊虚拟机上运行的字节码。Greeter合约能够做的事情就是返回我们提供的字符串,在上述例子中就是“Hello,world!”或者是类似的东西。当我们使用完这个合约,“mortal”类型给我们一个直截了当的方式来终止合约,它将把任何创建合约时的初始资金返回到最初创建合约时提供的以太坊地址。Mortal合约可以作为你编写的任何其他合约的基础——因为Solidity语言支持合约完整继承模式。
为了部署这个合约,你需要将其编译成以太坊虚拟机字节码。你应该搭建一个本地的编译器来安全的完成这个工作,因为在线编译器可能被损坏然后产生与预期结果不符的字节码。但是对于演示程序来说,使用基于网页的Solidity编译器应该就足够了。
假设你正在使用基于网页的编译器,你需要做的就是将你的Greeter代码粘贴到编译器中编译以获得右侧的编译字节码。更方便的是,右窗格还包含了可在以太坊JS控制台中运行的名为“Web3部署”的Javascript代码片段。请注意,你需要在该代码段的顶部填入一个greeting才能在以太坊控制台中运行,稍后你可能还需要用到这个“接口”片段。
现在,通过在新的shell中运行geth attach来打开一个新的以太坊JS控制台,然后粘贴到Web3部署代码段中。在几分钟之后,你将看到一条消息显示出出“合约已成功挖出!”以及合约现在所在的地址。你刚刚部署了你的第一个以太坊合约——恭喜你!
你可以在公共的区块浏览器(如https://etherchain.org/)上搜索交易哈希值来查找你的合约,甚至可以查看到已经部署的代码。请注意记录下这个哈希地址,因为你将很快就要用它来与合约进行交互。
要想和合约进行交互,请在同一个控制台中运行greeter.greet();
,然后你应该会得到先前输入的字符串。因为得到greeting不需要在区块链上运行任何代码,所以这个操作需要花费0个单位的gas。当你粘贴到Web3部署代码片段中时,“greeter”对象被实例化,但这也可以独立设置,所以任何人都可以不要需要本地的源代码副本就可以运行这个合约。
为了展示其他节点如何在其本地的以太坊节点上运行相同的Greeter合约,我们可以在全新的控制台环境中运行相同的合约。通过运行exit关闭你的以太坊控制台,并再次运行geth attach
来重新打开它。要验证你是否处于一个干净的控制台环境中,请运行greeter.greet()
,然后你应该会得到一个引用错误显示名称未定义。现在,通过运行var greeter = eth.contract(ABI).at(“Address”);
来实例化一个新的实例,这里ABI是前面提到的Solidity编译器的“Interface”片段,而Address是合约被挖矿后的地址。现在你可以运行“greeter.greet()”来获取你之前得到的相同消息。
在这里有一个重要的注意事项是你所指定的字符串现在存储在区块中,并且可以被任何人访问;你甚至可以创建一个功能,只允许作为合约所有者的你本人来更改它。
我在地址
“0xb55f89461a273f8dbde74a92cdc752d86427476b”上有另一个greeter合约,并且它使用了Solidity的Web编译器为你的greeter合约提供的相同“接口”片段。再给你一点提示,你可以通过运行greet函数来看到我在合约中所编写的消息。
虽然这看起来没有什么用,从开发者的角度来说也确实是这样;你正在运行一个非常简单的hello world程序,而且它产生了你期望的输出。这里真正有趣的是,此代码现在位于以太坊区块中,并且可以访问高度分布、防止审查和篡改的存储和计算资源,并不需要作为开发人员的你去搭建自己的分布式基础设施。
要终止你的合约,请运行greeter.kill.sendTransaction({from:“ACCOUNT_ADDRESS”})
,其中ACCOUNT_ADDRESS是你之前创建帐户时的返回得到地址。之后你的greeter合约就不能再运行了。
我在这里省略了一些细节,但希望这些演示足以激发你的兴趣去探索更多的知识。在这篇文章中我还无法覆盖我们创建的一些项目,所以几周之后我们会发布后续的博客。
原文链接:https://medium.com/@kpcb_edge/our-thoughts-on-ethereum-31520b164e00
作者:KPCB Edge
翻译&校对:Stuart & Elisa