构建智能合约

链客,专为开发者而生,有问必答!

此文章来自链客区块链技术问答社区,未经允许拒绝转载。
在这里插入图片描述

运用指令行构建智能合约

此页面将协助您在以太坊指令行上构建Hello,World合约。假定您不知道怎样运用指令行,我们建议您跳过本教程,而是运用图形用户界面构建自界说符号。

智能合约是以太坊区块链上的账户持有政策。它们包括代码功用,可以与其他合同进行交互,拟定挑选计划,存储数据并将乙醚发送给他人。合同是由他们的创造者界说的,但是他们的实施,以及他们供应的服务,都是由以太网本身供应的。只需整个网络存在,它们就会存在并且可实施,并且只需在程序被自毁时才会消失。

你能用合同做什么?那么,你简直可以做任何作业,但是关于我们的入门攻略,我们来做一些简略的作业:首要你会创建一个经典的“Hello World”合约,然后你可以建立自己的加密符号发送给任何你喜欢的人。一旦你掌握了这一点,那么你将通过众筹筹集资金,假定成功的话,将供应一个完全透明和民主的组织,只会遵循自己的公民,永久不会脱节它的宪法,不能被检查或关闭。而全部这些都在不到300行的代码中。

在你开端之前:

设备以太坊CLI

具体了解合约

进入geth控制台之前,请供认GUI已关闭。作业geth以开端同步进程(榜初次作业或许需求一段时间)。

那我们现在就开端吧。

你的榜首个公民:欢迎你

现在你现已掌握了以太坊的基本知识,让我们进入你的榜首个严厉的合同。前沿是一个很大的翻开疆域,有时候你或许会感到孑立,所以我们的榜首步便是创造一个自动伴侣,在你感到孑立时迎接你。我们会称他为“温文”。

Greeter是一个智能数字化实体,它存在于区块链中,并可以依据其输入与任何与之交互的人进行对话。它或许不是一个说话者,但它是一个很好的倾听者。这是它的代码:

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) selfdestruct(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(我们运用的高档合同言语)具有继承性,这意味着一个合约可以继承另一个合约的特征。这对简化编码十分有用,因为合约的通用特征不需求每次重写,并且全部合约都可以用更小,更易读的块编写。所以通过只声明迎宾者是丧身的,你就继承了来自“俗人”合约的全部特征,并使迎宾代码简略易读。

继承特征的“俗人”只是意味着迎宾合同可以被其全部者杀死,以拾掇区块链并在不再需求合一起收回锁定在其间的资金。以太坊中的契约默以为不朽,并且没有全部者,这意味着一旦安排,作者就没有特别的特权了。安排前请考虑这一点。

运用Solc编译器编译您的合同

在您可以安排您的合同之前,您需求两件作业:

编译后的代码

运用程序二进制接口,它是一个界说怎样与合约进行交互的JavaScript政策

你可以通过运用Solidity编译器来获得这两者。假定你还没有设备编译器,你可以:

依照设备Solidity Compiler的说明在机器上设备编译器

运用Remix,一个依据网络的Solidity IDE

SOLC在您的机器上

=======

假定您在机器上设备了编译器,则需求编译合约以获取编译的代码和运用程序二进制接口。

solc -o target --bin --abi Greeter.sol

这将创建两个文件,一个文件包括已编译的代码,另一个文件在名为target的目录中创建运用程序二进制接口。

$tree . ├── Greeter.sol └── target ├── Greeter.abi ├── Greeter.bin ├── Mortal.abi └── Mortal.bin

你会看到有为两个合同创建的文件; 但是因为Greeter包括Mortal,你不需求安排Mortal来安排Greeter。

您可以运用这两个文件来创建和安排合同。

var greeterFactory = eth.contract() var greeterCompiled = “0x” + “”

你现在编译了你的代码,并将它供应给Geth。现在您需求准备好进行安排,这包括设置一些变量,例如您期望运用的问候语。将下面的榜首行修改为比“Hello World!”更幽默的内容 并实施这些指令:

var _greeting = “Hello World!” var greeter = greeterFactory.new(_greeting,{from:eth.accounts[0],data:greeterCompiled,gas:47000000}, function(e, contract){ if(e) { console.error(e); // If something goes wrong, at least we’ll know. return; } if(!contract.address) { console.log(“Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined…”); } else { console.log("Contract mined! Address: " + contract.address); console.log(contract); } })

运用混音

假定你没有设备Solc,你可以简略地运用在线IDE。将源代码(位于本页顶部)复制到Remix,它应该自动编译您的代码。您可以放心肠疏忽右侧任何黄色警告框。

要访问已编译的代码,请确保已greeter挑选右侧窗格中的下拉菜单。然后直接点击下拉菜单右边的具体信息按钮。在弹出窗口中,向下翻滚并复制WEB3DEPLOY文本框中的全部代码。

在您的核算机上创建一个暂时文本文件并粘贴该代码。确保将榜首行更改为如下所示:

var _greeting = “Hello World!”

现在您可以将成果文本粘贴到您的geth窗口中,或许运用导入文件。等候30秒钟,你会看到这样的音讯:loadScript(“yourFilename.js”)

Contract mined! address: 0xdaa24d02bad7e9d6a80106db164bad9399a0423e

您或许有必要运用您在开端时挑选的暗码来“解锁”发送生意的帐户,因为您需求支付安排合同的天然气本钱:例如,personal.unlockAccount(web3.eth.accounts[0], “yourPassword”)

该合同估量需求约18万个气体安排(依据在线固体编译器),在编撰本文时,测试网上的气体价格为20 gwei(等于(20000000000 wei,或0.00000002 ether)每单位有许多有用的核算数据,包括网络核算页面上的最新天然气价格。

请注意,这些费用不会支付给以太坊开发人员,而是发给矿工,那些核算机正在尽力寻觅新块并确保网络安全的同行。天然气价格由当前核算供需商场挑选。假定天然气价格太高,你可以成为矿工并下降你的要价。

在不到一分钟的时间内,你应该有一个合同地址的日志,这意味着你现已成功地安排了你的合同。您可以运用以下指令来验证已安排的代码(将被编译):

eth.getCode(greeter.address)

假定它回来“0x”以外的任何内容,那么恭喜!你的小家伙活着!假定再次创建合同(通过实施另一个eth.sendTransaction),它将发布到新地址。

作业Greeter

为了打电话给你的机器人,只需在终端上输入以下指令:

greeter.greet();

因为此告诉在区块链上没有任何改动,因而它会当即回来并且无需任何燃气费用。你应该看到它回来你的问候语:

‘Hello World!’

让其他人与您的代码进行交互

为了让其他人来实施你的合同,他们需求两件作业:

在Address那里合同地址

该ABI(运用程序二进制接口),这是一种用户手册中描绘的合同的函数的称号以及怎样将它们呼喊到你的JavaScript控制台

要获取Address,请作业以下指令:

greeter.address;

要获取ABI,请作业以下指令:

greeterCompiled.greeter.info.abiDefinition;

提示:假定您运用Remix编译代码,则上面的终究一行代码不适合您!相反,您需求ABI直接从Remix中复制,与复制WEB3DEPLOY编译代码的办法相似。在右侧窗格中,单击具体信息按钮并向下翻滚到ABI文本框。点击复制按钮复制整个ABI,然后将其粘贴光暂时文本文档中。

然后,您可以实例化一个可用于在连接到网络的任何核算机上调用合约的JavaScript政策。在以下行中,替换ABI(数组)和Address(一个字符串)以在JavaScript中创建一个契约政策:

var greeter = eth.contract(ABI).at(Address);

这个特别的比如可以通过简略地调用来实例化:

var greeter2 = eth.contract([{constant:false,inputs:[],name:‘kill’,outputs:[],type:‘function’},{constant:true,inputs:[],name:‘greet’,outputs:[{name:’’,type:‘string’}],type:‘function’},{inputs:[{name:’_greeting’,type:‘string’}],type:‘constructor’}]).at(‘greeterAddress’);

当然,greeterAddress有必要用合同的仅有地址来替代。

自己拾掇后:

你有必要十分高兴才调签下榜首份合同,但当业主继续写下更多的合一起,这种激动有时会消失,导致在区块链上看到丢掉合同的不愉快现象。未来,区块链租金或许会实施以添加区块链的可扩展性,但现在,成为一个好公民并且人道地丢掉您的丢掉机器人。

生意将需求发送到网络,并在下面的代码作业后支付区块链所做更改的费用。自毁是由网络补助的,所以它的本钱比往常的生意要低得多。

greeter.kill.sendTransaction({from:eth.accounts[0]})

这只能由合同全部者发送的生意触发。您可以验证该行为是否完毕,只需看看它是否回来0即可:

eth.getCode(greeter.address)

请注意,每个合同都有必要实施自己的kill子句。在这种特别情况下,只需创建合同的账户才调杀死它。

假定你不添加任何杀人条款,它或许永久独立于你和任何地球上的间隔而永久活着,所以在你开端日子之前,请检查你的当地法令对此的观点,包括对技术出口的任何或许捆绑,言辞捆绑以及有关数字众生公民权利的任何立法。人道地对待你的机器人。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值