以太坊部署
在过去的几周中,我们设置了工具并编写了合同(并对其进行了测试)。 绝对是时候“真正”部署合同并运行它了。
这是第3 次后在开始复仇重点series.Other职位包括:
- 从以太坊开始-设置
- 以太坊开始-撰写合约
- 从以太坊开始-部署和运行合同 (本文)
- 从以太坊开始-智能合约
- 从以太坊开始-工业化
使用GUI
多亏了以太坊钱包,部署和运行合同变得微不足道。
- 在钱包中,进入菜单:合同标签。
- 单击“ Deploy New Contract 。
- 粘贴实体代码。
在区块链上部署合同需要花费大量的时间和金钱! 与在公司的Tomcat或AWS(或任何其他方式)上进行传统部署不同,在以太坊上进行部署不是免费的。 通过部署合同,您可以更改区块链的状态。 因此,您需要为矿工付费。 而且您支付的越多,您就越能激励潜在的矿工尽早这样做:就像拍卖一样。
- 输入您的钱包密码以验证部署。
- 在某个时候,合同应该已经创建。
- 单击新创建的合同。
- 出现合同签名。
- 填写参数,并观察合同执行情况。
恭喜,您已经运行并部署了第一个合同!
使用命令行
尽管钱包允许部署和运行代码,但开发人员的方式是使用命令行。 让我们看看如何用它来重现以上步骤。
安装
第一步是安装以太坊命令行客户端 。 有一个官方的Go,C ++和Python客户。 geth
是Go的客户端,没有依赖关系。 让我们通过Homebrew安装它:
brew tap ethereum/ethereum
brewinstall ethereum
请记住,以太坊是由节点组成的网络。 geth
能够在本地运行这样的节点。 它还具有很多其他功能 ,包括挖掘。 要运行该节点,可以使用许多参数,例如网络本身,数据存储目录等。要轻松捕获它们,请确保启动了钱包,并运行ps -ef | grep geth
ps -ef | grep geth
。
~/Library/Application Support/Ethereum Wallet/binaries/Geth/unpacked/geth --rinkeby --syncmode fast \ --cache 1024 --ipcpath ~/Library/Ethereum/geth.ipc
是的,没错。 以太坊钱包包中有一个geth
二进制文件,并在下面运行它。 只需复制粘贴参数列表,新的独立版本就get
使用它们。
geth--rinkeby--syncmode fast --cache 1024 --ipcpath ~/Library/Ethereum/geth.ipc
此时,日志应显示同步数据,例如:
Imported new chain segment blocks=1 txs=10 mgas=0.655 elapsed=7.089ms mgasps=92.422 number=1441983 hash=d8656c…759081
为了与本地节点进行交互, geth
还提供了一个JavaScript控制台。 在另一个选项卡中,运行get attach
。 输出如下:
Welcome to the Geth JavaScript console!
instance: Geth/v1.7.3-stable/darwin-amd64/go1.9.2
coinbase: 0x364d73b70f429a9a8d3964b54334dd9a4f7c0c6d
at block: 1441934 (Tue, 19 Dec 2017 14:13:09 CET)
datadir: ~/Library/Ethereum/rinkeby
modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
在不同选项卡中运行geth和get attach命令等效于仅运行geth console(和参数列表)。
该控制台提供了专用于与以太坊区块链交互的完整API 。
由于电子钱包在下面运行geth,因此可以运行get attach,它将附加到基础进程。
简单的操作
首先,让我们使用控制台打印所有已配置的帐户:
web3.eth.accounts;
["0x364d73b70f429a9a8d3964b54334dd9a4f7c0c6d"]
到目前为止只有一个。 现在让我们要求平衡:
web3.eth.getBalance(web3.eth.accounts[0]);
18748024152000000000
编制合同
使用solc
命令(与Homebrew一起安装在geth
)在控制台外部完成solc
源代码的编译。
solc--abi--bin--gas-o /tmp Mathematic.sol
上面的代码会将当前文件夹中的Mathematic.sol
文件以及/tmp
文件夹中的ABI接口以及二进制文件编译为二进制格式,并输出运行该文件的估计天然气成本(更多关于天然气的信息)。
======= Mathematics.sol:Mathematic ======= Gas estimation: construction: 82 + 37200 = 37282 external: add(uint256,uint256): 265
虽然二进制文件显然是将要部署的二进制文件,但是应用程序二进制文件接口(ABI)是与二进制文件进行交互的接口。 ABI是一个JSON数组,包含合同的方法签名。 应用程序二进制接口是与以太坊生态系统中的合同进行交互的标准方法,既可以从区块链外部进行,也可以用于合同之间的交互— Solidity文档https://solidity.readthedocs.io/en/develop/abi-spec .html
部署合同
部署需要更高级地使用web3 API:
varmyAccount=web3.eth.accounts[0]; (1)
varaddContract=web3.eth.contract(<content/of/ABI>); (2)
varbinary='0x<content/of/binary>'; (3)
varestimatedGas=web3.eth.estimateGas({data:binary}); (4)
varaddContractInstance=addContract.new({data:binary,from:myAccount,gas:estimatedGas}); (5)
- 参考所需的帐户。 如果您有多个帐户,则可以直接使用您帐户的公共密钥。
- 对要部署的合同的引用,源于其界面。
- 合同的二进制内容。 请注意,对于当前版本的客户端,应将其前缀为
0x
。 - 估计用于部署的气体。 在区块链上进行部署需要花费一定的成本,因为矿工需要扩展CPU和时间来在区块链上编写您的合同。 气体是转化为醚的中间单元。
- 部署新合同
运行上面的代码片段可能会输出以下内容:
authentication needed: password or unlock
显然,您的帐户是安全的,因此没有人可以将资金自动汇入自己。 在对以太坊进行任何幻想之前,应该先进行身份验证。 这可以通过以下方式实现:
web3.personal.unlockAccount(myAccount,'<password>',10000);
第三个参数是帐户将保持解锁状态的时间。 对于“生产”网络,建议使用时间很短。 对于Rinkeby而言,使用更长的时间不是问题。
现在,重复上述过程即可。
另外,日志应已显示在主geth
选项卡中:
INFO [12-20|10:05:21] Submitted contract creation fullhash=0x1154ab7f1e82652be87c547b48f489d94dd9900289af0dc176e40881802676a4 contract=0xc94482fDd959E83C6CE85D82187E6F16b8562EDe
执行合同
运行合同就像在已部署的合同引用上调用定义的方法一样容易:
addContractInstance.add(6,6);
12
但是,通常,合同只部署一次并运行多次。 要获取上一个会话中部署的合同(或第三方合同)的参考,请执行以下操作:
- 用其ABI接口实例化一个对象。
- 填写地址。
varanotherContract=web3.eth.contract(<content/of/ABI>);
varanotherContractInstance=anotherContract.at('0x<address'>);
我们提供的合同地址可用:
- 在已部署合同的
address
属性中, 例如 :addContractInstance.address;
- 在部署日志的“
contract
属性下
恢复合同地址如果您丢失了所有引用,无论出于何种原因,都不会失去希望。 仍然可以恢复合同地址。 转到https://rinkeby.etherscan.io。搜索您的帐户公钥。 掌握交易日志,然后搜索交易哈希,现在可以看到合约地址:
以太坊部署