主页 > imtoken最新版本下载 > 以太坊开发基础(三)创建交易和部署合约

以太坊开发基础(三)创建交易和部署合约

imtoken最新版本下载 2023-10-14 05:08:40

以太坊开发基础(三)创建交易和部署合约

在以太坊上使用智能合约需要特殊交易。 我们需要花费一定数量的以太币来调用智能合约,将一定数量的以太币转入智能合约的地址。 在我们学习实现智能合约之前,我们需要了解如何创建交易。

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 中使用哪些方法与以太坊进行交互。 具体可以参考官方文档: 可以参考:...