使用geth在以太坊私链中部署合约并调用智能合约的函数

使用geth在以太坊私链中部署合约并调用智能合约的函数

在上一个教程中我们已经创建了一个私链了,接下来我们将在这个私链上创建用户并挖矿,再使用此用户来部署智能合约,并调用其中的函数

环境:linux操作系统

  • 首先打开geth控制台
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......账户地址") // 通过地址查询出账户余额
  • 挖矿赚钱
    我们创建的账户没有钱,想要部署合约和调用函数就得有钱。所以我们挖矿来赚钱。
    挖矿所得的奖励会进入矿工的账户。这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户,即eth.accounts[0]。
eth.coinbase // 第一种查看矿工的账户地址的方式,该地址默认为第一个账户地址
web3.eth.coinbase // 第二种查看方式矿工地址的方式
miner.setEtherbase(eth.accounts[1]) 
//设置矿工用户。矿工的账户地址即奖励地址,括号里面填写用户地址。这里设置eth.accounts[1]为挖矿的账户地址。

下面正式开始挖矿:

miner.start() //挖矿开始

第一次挖矿会等待很久,下面这种情况就是还在准备:
使用geth在以太坊私链中部署合约并调用智能合约的函数_第1张图片 Percentage=100的时候就开挖了:
使用geth在以太坊私链中部署合约并调用智能合约的函数_第2张图片挖一会就有钱了。

停止挖矿

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/
使用geth在以太坊私链中部署合约并调用智能合约的函数_第3张图片

录入智能合约的ABI

var abi=JSON.parse('ABI')
//录入ABI。

ABI可以在remix中复制,但是上面代码中的ABI为remix中复制下来的ABI删除压缩并转义后的代码。压缩转义我用的为http://www.bejson.com/zhuanyi/这个网址。
使用geth在以太坊私链中部署合约并调用智能合约的函数_第4张图片使用geth在以太坊私链中部署合约并调用智能合约的函数_第5张图片使用geth在以太坊私链中部署合约并调用智能合约的函数_第6张图片

估算部署合约要用的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
//调用这个可以看到我们部署到链上的合约的地址了。这个值保存下来。以后要用到。

至此合约已经部署到了我们搭建的私链上了。

  • 如何调用已经部署好的合约
    -重新启动geth控制台或者使用其他包时,调用原来部署好的智能合约要通过合约地址。
    -没有写入链上的变量在经历重启geth或者重启web3程序时都会没有了。但是如果部署好的智能合约,并且写入数据时运用的交易都挖矿写入链中了。那么再次通过地址调用时关于合约的数据就都还保留着。
    -下面示例在geth中调用合约的方法。假设我们现在已经重启了geth控制台,首先还是要用合约地址实例化一个合约出来。
var abi=JSON.parse(‘合约的abi’)
//录入ABI。格式同上一节
myContract = eth.contract(abi)
//创建类
contract = myContract.at(address)
//创建合约实例,这里要指名部署过的合约地址。地址先前已经保存。
  • 通过geth控制台调用智能合约中的函数
    智能合约中的函数分为两类,一种是需要付gas才能调用的函数,一种是无需花费gas的函数。这两类函数在geth控制台中被调用时用到的命令不一样,这里分别举两个例子。
personal.unlockAccount(eth.coinbase)
//记得先解锁账户
contract.函数名.sendTransaction("参数1","参数2","参数...",{from:"0xe473d288faf6c2d1812dbb759d7423605c7d1a58"})
//上面是在geth控制台调用transactionn类型(要付gas类的)函数的方法。函数名要替换成自己的,括号内部前部分为函数的参数,分别列出,最后一项大括号内from要写付费的用户的地址(换成自己的)。
contract.函数名.call("参数1","参数2", "参数...")
//调用call类型函数的方法,(不要付gas类的)。

你可能感兴趣的:(区块链,linux)