主页 > imtoken钱包下载国际版 > 如何使用智能合约?

如何使用智能合约?

imtoken钱包下载国际版 2023-03-28 06:35:13

在以太坊社区中,有很多实用的工具,提供编写、编译、发布、调用智能合约等功能。 用户和开发者可以根据自己的需要或开发环境进行选择。 搭建区块链进行测试由于在以太坊公链上测试智能合约需要消耗以太币,开发者可以选择在本地搭建测试链用于开发测试场景。 开发好的智能合约可以通过切换接口轻松部署到公链上:

构建用于测试的区块链:

由于在以太坊公链上测试智能合约需要消耗以太币,对于开发者开发测试场景,可以选择在本地搭建一条测试链。 开发的智能合约可以方便的切换部署到公链上。 注意测试链不同于以太坊公链,需要给出一些非默认的手动配置。

配置初始状态:

首先配置私有区块链网络的初始状态。 使用以下内容创建一个新文件 genesis.json。 { “config”:{ “chainId”:22, “homesteadBlock”:0, “eip155Block”:0, “eip158Block”:0 }, “alloc”:{},“coinbase”:“0x0000000000000000000000000000000000000000”以太坊智能合约开发, “难度”: "0x400", "extraData" : "", "gasLimit" : "0x2fefd8", "nonce" : "0x0000000000000038", "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp" : "0x00"其中,chainId指定了一个独立的区块链网络ID,不同ID网络的节点之间不能相互连接。 配置文件还设置了当前挖矿难度difficulty、区块Gas消耗上限gasLimit等参数。

4.启动区块链

使用以下命令初始化区块链以生成创世块和初始状态。

$ geth --datadir /path/to/datadir init /path/to/genesis.json 其中--datadir指定区块链数据的存储位置,您可以自行选择一个目录地址。 接下来使用以下命令启动节点,进入Geth命令行界面。 $ geth --identity "TestNode" --rpc --rpcport "8545" --datadir /path/to/datadir --port "30303" --nodiscover console 各选项含义如下。 --identity:指定节点ID; --rpc:表示开启HTTP-RPC服务; --rpcport:指定HTTP-RPC服务监听端口号(默认为8545); --datadir:指定区块链数据 --port:指定用于连接其他节点的端口号(默认为30303); --nodiscover:关闭节点发现机制,防止加入具有相同初始配置的陌生节点;

1. 创建账户:

使用上述 geth 控制台命令访问的命令行界面使用 JavaScript 语法。 您可以使用以下命令创建一个新帐户。

> personal.newAccount() Passphrase: Repeat passphrase: "0x1b6eaa5c016af9a3d7549c867996631183f129e" 输入两次密码后,会显示生成的账号,如"0x1b6eaa5c016af9a3d7549c8679966311183f129e"。 您可以使用以下命令查看账户余额。 > myAddress = "0x1b6eaa5c016af9a3d7549c8679966311183f129e" > eth.getBalance(myAddress) 0 当前账户余额为0,可以使用miner.start()命令进​​行挖矿。 由于初始难度设置很小,所以很容易挖出一些余额。 miner.stop() 命令可以停止挖矿。

2. 创建和编译智能合约

以用 Solidity 编写的智能合约为例。 为了将合约代码编译成 EVM 二进制文件,需要安装 Solidity 编译器 solc。

$ apt-get install solc 使用以下内容创建一个名为 testContract.sol 的新 Solidity 智能合约文件。 合约包含一个 multiply 方法,它将输入整数乘以 7 并输出它。 pragma solidity ^0.4.0; contract testContract { function multiply(uint a) returns(uint d) { d = a * 7; } } 使用solc获取合约编译后的EVM二进制代码。 $ solc --bin testContract.sol ======= testContract.sol:testContract ======= Binary: 6060604052341561000c57fe5b5b60a58061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603a575bfe5b3415604157fe5b60556004808035906020019091905050606b565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a72305820748467daab52f2f1a63180df2c4926f3431a2aa82dcdfbcbde5e7d036742a94b0029 再用solc 获得合约的JSON ABI(Application Binary Interface),其中指定了合约接口,包括可调用的合约方法、变量、事件等。

$ solc --abi testContract.sol ======= testContract.sol:testContract ======= 合约 JSON ABI [{"constant":false,"inputs":[{"name":"a ","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false, "type":"function"}] 我们回到Geth的JavaScript环境的命令行界面,用变量记录上面两个值。 注意代码前的 0x 前缀。 > code = "0x6060604052341561000c57fe5b5b60a58061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603a575bfe5b3415604157fe5b60556004808035906020019091905050606b565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a72305820748467daab52f2f1a63180df2c4926f3431a2aa82dcdfbcbde5e7d036742a94b0029" > abi = [{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply"," outputs":[{"name":"d","type":"uint256"}],"payable":false,"type":"function"}]

3.部署智能合约

在 Geth 的 JavaScript 环境命令行界​​面,首先使用以下命令解锁您的账户,否则您无法发送交易。 > personal.unlockAccount(myAddress) 解锁账户 0x1b6eaa5c016af9a3d7549c8679966311183f129e Passphrase: true 接下来,发送交易来部署合约。 > myContract = eth.contract(abi) > contract = myContract.new({from:myAddress,data:code,gas:1000000}) 如果此时没有挖矿,使用txpool.status命令查看本地交易pool 有待处理的事务。 您可以使用以下命令查看当前待确认的交易。 > eth.getBlock("pending",true).transactions [{ blockHash: "0xbf0619ca48d9e3cc27cd0ab0b433a49a2b1bed90ab57c0357071b033aca1f2cf", blockNumber: 17, from: "0x1b6eaa5c016af9a3d7549c8679966311183f129e", gas: 90000, gasPrice: 20000000000, hash: "0xa019c2e5367b3ad2bbfa427b046ab65c81ce2590672a512cc973b84610eee53e", input: "0x6060604052341561000c57fe5b5b60a58061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603a575bfe5b3415604157fe5b60556004808035906020019091905050606b565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a72305820748467daab52f2f1a63180df2c4926f3431a2aa82dcdfbcbde5e7d036742a94b0029" , nonce: 1, r: "0xbcb2ba94f45dfb900a0533be3c2c603c2b358774e5fe89f3344031b202995a41", s: "0x5f55fb1f76aa11953e12746bc2d19fbea6aeb1b9f9f1c53a2eefab7058515d99", to: null, transactionIndex: 0, v: "0x4f", value: 0 }] 可以用miner.start() 命令挖矿,一段时间后, 交易将被确认,即输入 b 与新区块的锁链。

5.调用智能合约

可以通过以下命令发送交易,其中sendTransaction方法的前几个参数对应合约中multiply方法的入参。 这样以太坊智能合约开发,交易会通过挖矿记录在区块链中,如果涉及到状态变化,也会得到全网的共识。 > contract.multiply.sendTransaction(10, {from:myAddress}) 如果只是想在本地运行该方法查看返回结果,可以使用以下方法获取结果。 > contract.multiply.call(10) 70。

相关文章