使用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() //挖矿开始

第一次挖矿会等待很久,下面这种情况就是还在准备:
在这里插入图片描述 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
//调用这个可以看到我们部署到链上的合约的地址了。这个值保存下来。以后要用到。

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

  • 如何调用已经部署好的合约
    -重新启动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类的)。
  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要连接Metamask到Geth有链,你需要按照以下步骤进行操作: 1. 首先,在Metamask钱包点击右上角的网络切换按钮,选择“Custom RPC”(自定义RPC)选项。 2. 在“Custom RPC”页面,填写有链的网络名称,可以根据需要自行设置。RPC URL的格式为http://服务器地址:http端口号,例如:http://81.72.166.130:8545。链ID即为有链定义的networkid。 3. 点击“Save”(保存)按钮,保存配置。 4. 确保你已经启动了Geth有链。你可以使用以下命令启动有链: ``` geth --datadir data --networkid 15 --http --http.addr 0.0.0.0 --http.port 8545 --http.corsdomain "*" --port 30305 --allow-insecure-unlock console 2>>geth.log ``` 5. 如果你使用的是云服务器,需要在服务器管理界面开启对应的端口,特别是http.port对应的端口,以便Metamask钱包能够连接到有链节点。 6. 现在,你可以在Metamask钱包选择你配置的有链网络,并使用你在有链上的账户进行操作了。 请注意,以上步骤的具体配置和命令可能会根据你的有链设置而有所不同。确保按照你的有链的要求进行配置和启动。 #### 引用[.reference_title] - *1* *2* *3* [以太坊链搭建(一)——环境配置和metamask连接](https://blog.csdn.net/llslinliansheng/article/details/123596009)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值