主页 > imtoken钱包苹果版下载 > 以太坊开发基础(三)创建交易和部署合约
以太坊开发基础(三)创建交易和部署合约
以太坊开发基础(三)创建交易和部署合约
在以太坊上使用智能合约需要特殊交易。 我们需要花费一定数量的以太币来调用智能合约,将一定数量的以太币转入智能合约的地址。 在我们学习实现智能合约之前,我们需要了解如何创建交易。
1. 发布交易
第一步:在一个节点上,获取coinbase账户并解锁。
> coinbaseAddress = eth.coinbase > personal.unlockAccount(coinbaseAddress) Unlock account 0x4e7b6e350db51b1cea072dce8a507683cb83f814 Passphrase: True
第2步:现在从另一个节点的coinbase账户或其他账户复制地址并返回解锁账户节点
> hisAddress = "0xb161ffdc6a63963bfbf7b12069ff52cfe5d42cbc"
第三步:sendTransaction
> eth.sendTransaction({from: eth.coinbase, to: hisAddress, value: 100000000}) INFO [08-24|19:55:15.585] Submitted transaction fullhash=0x278445d113e9526ee84e7c583dbb65f5d293b80e9b1a836cf0d4e8442e61b560 recipient=0xb161ffDc6A63963BfBF7B12069FF52CfE5D42cBC "0x278445d113e9526ee84e7c583dbb65f5d293b80e9b1a836cf0d4e8442e61b560"
还有一件事需要注意,而且很容易混淆,那就是为什么这些数字的值中有这么多零。 这是因为值是用 wei 表示的,所以你不必处理可能在不同系统上引起问题的浮点数。 这将与gas(一种大致相当于计算步骤的度量。每笔交易需要包括gas limit和他们愿意为每种gas支付的费用;矿工可以选择进行交易和收费)一起发挥作用,并且需要开始指定合约部署和交易。
如果你想知道用这个值发送了多少以太币,命令如下:
> web3.fromWei(100000000,'ether') “0.0000000001”
第四步:要发送交易,查看不同余额的差异,需要在节点中启动矿机,挖完一个块就停止,现在查看余额看变化。
> miner.start() ............... > miner.stop() > web3.eth.getBalance(eth.coinbase) 59999999999900000000 > web3.eth.getBalance(hisAddress) 100000000
2.部署合同
部署合约就是将编写好的智能合约编译成EVM(以太坊虚拟机)可以理解的二进制代码(Contract Bytecode),存储在区块链上。 部署在区块链上的合约会有一个与钱包地址格式相同的合约地址。
部署合约后,当用户需要调用合约提供的方法时,就是向这个合约地址发起交易。
部署合约的方式有很多种。 可以通过web3.js编写合约部署脚本,然后在geth控制台中运行来部署合约。 也可以通过 remix-ide 部署,或者部署在 truffle 框架内。
1. Remix IDE 编写第一个智能合约
Remix ide是开发以太坊智能合约的神器,支持网页在线编写、部署和测试智能合约.url
进入后,新建一个智能合约,命名为HelloWrold.sol,合约代码如下:
pragma solidity ^0.4.24; contract HelloWorld{ function say() public pure returns(string){ return "Hello Wrold"; } }
remix可以检查合约代码编写的正确性,如果编译失败,会显示在右侧工具栏中。 编译通过如下图所示:
2. Remix link私链
首先打开我们的私有链环境,然后在remix界面点击右侧的Run按钮,在界面下拉Environment选择Web3 Provider,弹出窗口询问我们是否要链接以太坊节点,点击ok ,然后点击新建,在弹出的窗口中输入我们启动私链时设置的地址,默认是localhost:8545。 单击确定链接。 链接成功后以太坊合约地址创建规则,可以在账户栏显示账户信息。
这里需要注意的是链接私链会出现如下错误:
无法连接到 Web3 提供商。 确保提供程序正在运行并且连接已打开(通过 IPC 或 RPC)。
因此,在启动私有链时必须使用以下参数:
--rpccorsdomain="*" // 允许跨域请求
完整的命令是:
geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --port "30303" --networkid "29382" --ws --wsorigins="*" --rpccorsdomain="*" console
3.使用remix-ide部署智能合约
(1) 在部署合约之前,首先要解锁账户,在geth中输入命令解锁账户:
>personal.unlockAccount(eth.accounts[0],"123",0) true
(2)在remix的Run界面点击粉色的deploy按钮进行部署,在remix的控制台和geth的日志文件中可以看到私有链中新增了一笔交易。
(3) 在geth中开始挖矿,等待区块确认
>miner.start()
部署成功后,可以在remix右侧的Run界面显示合约部署的地址和合约方法,供我们测试。
4.使用geth部署智能合约
在remix-ide的编译界面,智能合约编译成功后,可以看到智能合约的详细信息:
在弹出的对话框中找到WEB3DEPLOY部分,点击复制,粘贴到编辑器中,修改初始化字符串为hello world。
var _greeting5 ="hello world" ; var helloContract5 = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_greeting5","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]); var hello = helloContract5.new( _greeting5, { from: web3.eth.accounts[2], data: '0x606......029', gas: '4700000' }, function (e, contract){ console.log(e, contract); if (typeof contract.address !== 'undefined') { console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); } })
该副本将位于 geth 控制台中。 回车后可以看到输出,说明合约已经部署成功。
5.测试合约
(1) remix下测试
在remix下,只需点击say按钮,即可在控制台查看合约的执行结果。 输出为 Hello World,测试通过。
(2)geth下测试
在geth下测试其实就是在console中使用web3.js进行操作:
首先复制remix-ide的Run界面上的detail按钮,得到合约的abi(abi是合约接口的描述);
然后以太坊合约地址创建规则,复制合约地址
合约地址:0x2668d1b0602bc0e1e2f84f931547940546720d75 abi: [{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false, "stateMutability":"pure","type":"function"}
最后,使用 web3 获取合约实例:
var contract = web3.contract(abi).at(contractAddress);
调用合约方法,输出Hello World,测试成功。
> contract.say() "Hello Wrold"
下一节:以太坊开发基础(四)geth控制台方法以太坊源码分析
此列表只是概述了可以在 geth 中使用哪些方法与以太坊进行交互。 具体可以参考官方文档: 可以参考:...