当前位置:   article > 正文

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

linux 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
  • 1
  • 创建用户
    此用户用来部署智能合约与调用其中函数
personal.newAccount("123456"//括号内是自定义的密码,返回“0x......”为创建出来的用户的地址。之后要用到。
eth.accounts //查询用户
eth.getBalance(eth.accounts[0]) // 通过eth.accounts[0]查询账户余额。若私链上有多个用户,第一个用户为eth.accounts[0],第二个为eth.accounts[1]。以此类推。
eth.getBalance("0x......账户地址") // 通过地址查询出账户余额
  • 1
  • 2
  • 3
  • 4
  • 挖矿赚钱
    我们创建的账户没有钱,想要部署合约和调用函数就得有钱。所以我们挖矿来赚钱。
    挖矿所得的奖励会进入矿工的账户。这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户,即eth.accounts[0]。
eth.coinbase // 第一种查看矿工的账户地址的方式,该地址默认为第一个账户地址
web3.eth.coinbase // 第二种查看方式矿工地址的方式
miner.setEtherbase(eth.accounts[1]) 
//设置矿工用户。矿工的账户地址即奖励地址,括号里面填写用户地址。这里设置eth.accounts[1]为挖矿的账户地址。
  • 1
  • 2
  • 3
  • 4

下面正式开始挖矿:

miner.start() //挖矿开始
  • 1

第一次挖矿会等待很久,下面这种情况就是还在准备:
在这里插入图片描述 Percentage=100的时候就开挖了:
在这里插入图片描述挖一会就有钱了。

停止挖矿

miner.stop()
//输入此命令停止挖矿。你在输入此命令时可能会发现。你边输入电脑一边还在挖矿。但是不用担心它回打断你的输入。你只要一股脑的输入miner.stop()回车就完事了。打断了不要重新输,要继续输入。回车就停下来了。
eth.getBalance(eth.accounts[0])
//再查账户,发现自己突然有钱了。
  • 1
  • 2
  • 3
  • 4

此账户中的以太币可以用来部署合约和调用函数

  • 部署合约
personal.unlockAccount(eth.coinbase)
//解锁账户。若打开geth节点的命令没有--allow-insecure-unlock的话这一步即使输对密码了也报错。出现这种情况,建议exit然后重新输入命令进入控制台。
  • 1
  • 2

账户解锁命令在调用函数的时候时不时就要用到。若出现如下报错,就是没有解锁账户导致的:
在这里插入图片描述录入智能合约的bytecode

var code="合约的bytecode"
//录入bytecode。
  • 1
  • 2

bytecode是指以太坊智能合约编译之后生成的16进制的代码。以在线编译器remix为例,在remix中写好智能合约并编译之后可以复制到此合约的bytecode。
在线编译器remix的网址为:http://remix.ethereum.org/
在这里插入图片描述

录入智能合约的ABI

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

ABI可以在remix中复制,但是上面代码中的ABI为remix中复制下来的ABI删除压缩并转义后的代码。压缩转义我用的为http://www.bejson.com/zhuanyi/这个网址。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

估算部署合约要用的gas

eth.estimateGas({data: code})
  • 1

部署合约

var myContract = eth.contract(abi)
//创建类
var contract1 =myContract.new({from:"0xe473d288faf6c2d1812dbb759d7423605c7d1a58",data:code,gas:1200000})
//创建合约实例。括号内部的from后填写的是你账户的地址。gas后填写你愿意支付的gas。原则上大于刚刚估计的值。
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述输入刚刚合约实例的名字。可以查看合约实例的信息。可以看到address合约地址那一栏没有东西说明合约还没有被放到链上。因为这个私链上现在就只有我们自己这一个用户。没有其它矿工来挖矿把这个合约写入链上。所以我们要自立更生,挖一下矿把合约写入链上。

contract1 //查看合约信息
txpool.status
//这个命令可以看到有没有待挖矿的交易。我们可以看到有一个。
miner.start()
miner.stop()
//挖一会矿再停下来。
txpool.status
//待挖矿交易变为0。就说明合约已经写入链上了。
contract1.address
//调用这个可以看到我们部署到链上的合约的地址了。这个值保存下来。以后要用到。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

  • 如何调用已经部署好的合约
    -重新启动geth控制台或者使用其他包时,调用原来部署好的智能合约要通过合约地址。
    -没有写入链上的变量在经历重启geth或者重启web3程序时都会没有了。但是如果部署好的智能合约,并且写入数据时运用的交易都挖矿写入链中了。那么再次通过地址调用时关于合约的数据就都还保留着。
    -下面示例在geth中调用合约的方法。假设我们现在已经重启了geth控制台,首先还是要用合约地址实例化一个合约出来。
var abi=JSON.parse(‘合约的abi’)
//录入ABI。格式同上一节
myContract = eth.contract(abi)
//创建类
contract = myContract.at(address)
//创建合约实例,这里要指名部署过的合约地址。地址先前已经保存。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 通过geth控制台调用智能合约中的函数
    智能合约中的函数分为两类,一种是需要付gas才能调用的函数,一种是无需花费gas的函数。这两类函数在geth控制台中被调用时用到的命令不一样,这里分别举两个例子。
personal.unlockAccount(eth.coinbase)
//记得先解锁账户
contract.函数名.sendTransaction("参数1","参数2","参数...",{from:"0xe473d288faf6c2d1812dbb759d7423605c7d1a58"})
//上面是在geth控制台调用transactionn类型(要付gas类的)函数的方法。函数名要替换成自己的,括号内部前部分为函数的参数,分别列出,最后一项大括号内from要写付费的用户的地址(换成自己的)。
contract.函数名.call("参数1","参数2", "参数...")
//调用call类型函数的方法,(不要付gas类的)。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/809717
推荐阅读
相关标签
  

闽ICP备14008679号