在上一个教程中我们已经创建了一个私链了,接下来我们将在这个私链上创建用户并挖矿,再使用此用户来部署智能合约,并调用其中的函数
环境:linux操作系统
sudo geth --datadir "./" --nodiscover --networkid 528 --ipcdisable --port 3333 --rpc --rpcport 4444 --rpcapi="db,eth,net,web3,personal" --allow-insecure-unlock --rpccorsdomain "*" console
personal.newAccount("123456")//括号内是自定义的密码,返回“0x......”为创建出来的用户的地址。之后要用到。
eth.accounts //查询用户
eth.getBalance(eth.accounts[0]) // 通过eth.accounts[0]查询账户余额。若私链上有多个用户,第一个用户为eth.accounts[0],第二个为eth.accounts[1]。以此类推。
eth.getBalance("0x......账户地址") // 通过地址查询出账户余额
eth.coinbase // 第一种查看矿工的账户地址的方式,该地址默认为第一个账户地址
web3.eth.coinbase // 第二种查看方式矿工地址的方式
miner.setEtherbase(eth.accounts[1])
//设置矿工用户。矿工的账户地址即奖励地址,括号里面填写用户地址。这里设置eth.accounts[1]为挖矿的账户地址。
下面正式开始挖矿:
miner.start() //挖矿开始
第一次挖矿会等待很久,下面这种情况就是还在准备:
Percentage=100的时候就开挖了:
挖一会就有钱了。
停止挖矿
miner.stop()
//输入此命令停止挖矿。你在输入此命令时可能会发现。你边输入电脑一边还在挖矿。但是不用担心它回打断你的输入。你只要一股脑的输入miner.stop()回车就完事了。打断了不要重新输,要继续输入。回车就停下来了。
eth.getBalance(eth.accounts[0])
//再查账户,发现自己突然有钱了。
此账户中的以太币可以用来部署合约和调用函数
personal.unlockAccount(eth.coinbase)
//解锁账户。若打开geth节点的命令没有--allow-insecure-unlock的话这一步即使输对密码了也报错。出现这种情况,建议exit然后重新输入命令进入控制台。
账户解锁命令在调用函数的时候时不时就要用到。若出现如下报错,就是没有解锁账户导致的:
录入智能合约的bytecode
var code="合约的bytecode"
//录入bytecode。
bytecode是指以太坊智能合约编译之后生成的16进制的代码。以在线编译器remix为例,在remix中写好智能合约并编译之后可以复制到此合约的bytecode。
在线编译器remix的网址为:http://remix.ethereum.org/
录入智能合约的ABI
var abi=JSON.parse('ABI')
//录入ABI。
ABI可以在remix中复制,但是上面代码中的ABI为remix中复制下来的ABI删除压缩并转义后的代码。压缩转义我用的为http://www.bejson.com/zhuanyi/这个网址。
估算部署合约要用的gas
eth.estimateGas({data: code})
部署合约
var myContract = eth.contract(abi)
//创建类
var contract1 =myContract.new({from:"0xe473d288faf6c2d1812dbb759d7423605c7d1a58",data:code,gas:1200000})
//创建合约实例。括号内部的from后填写的是你账户的地址。gas后填写你愿意支付的gas。原则上大于刚刚估计的值。
输入刚刚合约实例的名字。可以查看合约实例的信息。可以看到address合约地址那一栏没有东西说明合约还没有被放到链上。因为这个私链上现在就只有我们自己这一个用户。没有其它矿工来挖矿把这个合约写入链上。所以我们要自立更生,挖一下矿把合约写入链上。
contract1 //查看合约信息
txpool.status
//这个命令可以看到有没有待挖矿的交易。我们可以看到有一个。
miner.start()
miner.stop()
//挖一会矿再停下来。
txpool.status
//待挖矿交易变为0。就说明合约已经写入链上了。
contract1.address
//调用这个可以看到我们部署到链上的合约的地址了。这个值保存下来。以后要用到。
至此合约已经部署到了我们搭建的私链上了。
var abi=JSON.parse(‘合约的abi’)
//录入ABI。格式同上一节
myContract = eth.contract(abi)
//创建类
contract = myContract.at(address)
//创建合约实例,这里要指名部署过的合约地址。地址先前已经保存。
personal.unlockAccount(eth.coinbase)
//记得先解锁账户
contract.函数名.sendTransaction("参数1","参数2","参数...",{from:"0xe473d288faf6c2d1812dbb759d7423605c7d1a58"})
//上面是在geth控制台调用transactionn类型(要付gas类的)函数的方法。函数名要替换成自己的,括号内部前部分为函数的参数,分别列出,最后一项大括号内from要写付费的用户的地址(换成自己的)。
contract.函数名.call("参数1","参数2", "参数...")
//调用call类型函数的方法,(不要付gas类的)。