国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在本地以太坊私鏈上,使用go調(diào)用智能合約,獲取事件日志

這篇具有很好參考價(jià)值的文章主要介紹了在本地以太坊私鏈上,使用go調(diào)用智能合約,獲取事件日志。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、關(guān)于開(kāi)發(fā)環(huán)境搭建配置等可參考之前的文章 2、部署合約代碼erc20.js

const hre = require("hardhat");
async function main() {
  const CONTRACT = await hre.ethers.getContractFactory("ERC20");

  const contract = await CONTRACT.deploy();
  await contract.init("ERC20Name","ERC20Symbol");
  console.log("name:",contract.name(),"symbol:",contract.symbol());
  await contract.deployed();

  console.log(`contract deployed to ${contract.address}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

3、啟動(dòng)并上鏈

#切換到智能合約項(xiàng)目位置
npx hardhat node
#新開(kāi)一個(gè)窗口,確保localhost已經(jīng)在hardhat.config.js中配置了,可查看第一步鏈接對(duì)照
npx hardhat run scripts/erc.js --network localhost

4、新建一個(gè)文件夾,存放go項(xiàng)目,完成mod初始化等

完整go項(xiàng)目文件目錄

5、拷貝智能合約compile產(chǎn)生的ABI,在新文件夾中新建一個(gè)erc20.json文件

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-503299.html

在本地以太坊私鏈上,使用go調(diào)用智能合約,獲取事件日志

?

6、安裝abigen

go get github.com/ethereum/go-ethereum

#切換路徑 cd $GOPATH/pkg/mod/github.com/ethereum/go-ethereum@v1.10.25
sudo make && make devtools

#測(cè)試安裝
abigen --help

7、將ABI生成GO文件

abigen --abi erc20.json -pkg json -type erc20 --out erc20.go

8、編寫調(diào)用文件 main.go

package main

import (
	"context"
	"crypto/ecdsa"
	"fmt"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/crypto"
	"github.com/ethereum/go-ethereum/ethclient"
	"math/big"
	"mysolidity/json"
)

func main() {
	//合約地址
	contractAddress := "0x5FbDB2315678afecb367f032d93F642f64180aa3"
	//連接本地的以太坊私鏈(一定要保證本地以太坊私鏈已經(jīng)啟動(dòng))
	conn, err := ethclient.Dial("http://127.0.0.1:8545")
	fmt.Println("connect to local node...", conn)
	if err != nil {
		fmt.Errorf("could not connect to local node: %v", err)
		return
	}
	//創(chuàng)建合約
	erc20, err := json.NewErc20(common.HexToAddress(contractAddress), conn)
	if err != nil {
		fmt.Errorf("failed to instantiate a Token contract: %v", err)
		return
	}
	fmt.Println("contract token:", erc20)
	//調(diào)用合約查詢方法
	name, err := erc20.Name(&bind.CallOpts{
		Pending:     false,
		From:        common.Address{},
		BlockNumber: nil,
		Context:     nil,
	})
	if err != nil {
		fmt.Errorf("name:%v", err)
		return
	}
	symbol, err := erc20.Symbol(&bind.CallOpts{
		Pending:     false,
		From:        common.Address{},
		BlockNumber: nil,
		Context:     nil,
	})
	if err != nil {
		fmt.Errorf("name:%v", err)
		return
	}
	fmt.Println("name:", name, "symbol:", symbol)
	//查詢第一個(gè)賬戶余額
	b, err := erc20.BalanceOf(&bind.CallOpts{
		Pending:     false,
		From:        common.Address{},
		BlockNumber: nil,
		Context:     nil,
	}, common.HexToAddress("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"))//啟動(dòng)node默認(rèn)生成的第1個(gè)賬戶地址
	if err != nil {
		fmt.Errorf("BalanceOf:%v", err)
		return
	}
	fmt.Println("first balance:", b)
	第一個(gè)賬戶給第二個(gè)賬戶轉(zhuǎn)賬
	//私鑰,需要生成簽名
	privateKey, err := crypto.HexToECDSA("ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80")//私鑰注意去掉ox,這是啟動(dòng)node默認(rèn)生成的第1個(gè)賬戶的私鑰
	if err != nil {
		fmt.Errorf("err:%v\n", err)
		return
	}
	publicKey := privateKey.Public()
	publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
	if !ok {
		fmt.Errorf("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
		return
	}
	fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA)
	nonce, err := conn.PendingNonceAt(context.Background(), fromAddress)
	if err != nil {
		fmt.Errorf("%v", err)
		return
	}
	gasPrice, err := conn.SuggestGasPrice(context.Background())
	if err != nil {
		fmt.Errorf("%v", err)
		return
	}
	//chainID
	id, err := conn.ChainID(context.Background())
	if err != nil {
		return
	}
	fmt.Println("chainID:", id)
	auth, _ := bind.NewKeyedTransactorWithChainID(privateKey, id)
	auth.Nonce = big.NewInt(int64(nonce))
	auth.Value = big.NewInt(10)    
	auth.GasLimit = uint64(300000) 
	auth.GasPrice = gasPrice
	tx, err := erc20.Transfer(&bind.TransactOpts{
		Signer:   auth.Signer,
		From:     fromAddress,
		GasLimit: auth.GasLimit,
		GasPrice: auth.GasPrice,
		Context:  nil,
	}, common.HexToAddress("0x70997970C51812dc3A010C7d01b50e0d17dc79C8"), big.NewInt(8))
	if err != nil {
		fmt.Errorf("transfer:%v", err)
		return
	}
	fmt.Println("tx.GasPrice():", tx.GasPrice())
	//查詢兩個(gè)賬戶余額
	b, err = erc20.BalanceOf(&bind.CallOpts{From: fromAddress}, common.HexToAddress("0x70997970C51812dc3A010C7d01b50e0d17dc79C8"))//啟動(dòng)node默認(rèn)生成的第2個(gè)賬戶地址
	if err != nil {
		fmt.Errorf("BalanceOf:%v", err)
		return
	}
	fmt.Println("second balance:", b)
	b, err = erc20.BalanceOf(&bind.CallOpts{From: fromAddress}, fromAddress)
	if err != nil {
		fmt.Errorf("BalanceOf:%v", err)
		return
	}
	fmt.Println("first balance:", b)
}

9、查詢事件日志(完整開(kāi)發(fā)的一般流程,在鏈端開(kāi)發(fā)智能合約后,由前端使用web3.js等進(jìn)行交互,后端通過(guò)查詢事件日志修改數(shù)據(jù)庫(kù)信息展示)

package main

import (
	"context"
	"fmt"
	"github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/crypto"
	"github.com/ethereum/go-ethereum/ethclient"
	"math/big"
	"mysolidity/json"
)

func main() {
	//合約地址
	contractAddress := common.HexToAddress("0x5FbDB2315678afecb367f032d93F642f64180aa3")
	//websocket監(jiān)聽(tīng)
	client, err := ethclient.Dial("ws://127.0.0.1:8545/ws")
	if err != nil {
		fmt.Errorf("could not connect to local node: %v", err)
		return
	}
	query := ethereum.FilterQuery{
		FromBlock: big.NewInt(1), //生產(chǎn)環(huán)境中,從0開(kāi)始,查詢后修改區(qū)塊記錄,下一次就從后一個(gè)有記錄的區(qū)塊數(shù)開(kāi)始
		ToBlock:   big.NewInt(100),
		Addresses: []common.Address{
			contractAddress,
		},
	}
	erc20, _ := json.NewErc20(contractAddress, client)
	logs, err := client.FilterLogs(context.Background(), query)
	if err != nil {
		fmt.Errorf("err:%v\n", err)
		return
	}
	for _, vLog := range logs {
		if len(vLog.Topics) == 0 {
			continue
		}
		event := vLog.Topics[0].Hex()
		if event == TransferEvent() { //對(duì)對(duì)應(yīng)的事件進(jìn)行對(duì)應(yīng)的處理
			fmt.Println(vLog.Data)
			data, err := erc20.ParseTransfer(vLog)
			if err != nil {
				fmt.Errorf("err:%v\n", err)
				continue
			}
			fmt.Println(data.From.Hex(), data.To.Hex(), data.Value.Int64(), data.Raw.Data)
		}
	}
}
func TransferEvent() string {
	event := crypto.Keccak256Hash([]byte("Transfer(address,address,uint256)")).Hex()
	return event
}

10、測(cè)試結(jié)果(main.go為最后一次運(yùn)行結(jié)果)

在本地以太坊私鏈上,使用go調(diào)用智能合約,獲取事件日志

在本地以太坊私鏈上,使用go調(diào)用智能合約,獲取事件日志

?

到了這里,關(guān)于在本地以太坊私鏈上,使用go調(diào)用智能合約,獲取事件日志的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 《如何搭建一條私有多Geth節(jié)點(diǎn)的鏈》最新版以太坊私鏈搭建官方文檔要點(diǎn)翻譯

    Last edited on January 31, 2023 This guide explains how to set up a private network of multiple Geth nodes. An Ethereum network is private if the nodes are not connected to the main network. In this context private only means reserved or isolated, rather than protected or secure. A fully controlled, private Ethereum network is useful as a backend for core de

    2024年02月08日
    瀏覽(49)
  • java使用web3j,部署智能合約在測(cè)試鏈上,并調(diào)用(萬(wàn)字詳細(xì)教程)

    java使用web3j,部署智能合約在測(cè)試鏈上,并調(diào)用(萬(wàn)字詳細(xì)教程)

    最近在學(xué)區(qū)塊鏈相關(guān),想做點(diǎn)自己感興趣的。網(wǎng)上關(guān)于這塊部分的坑也比較多,最近也是問(wèn)了很多行業(yè)從事者才慢慢填坑,因此記錄下來(lái)分享一下。 錢包 :metemask、 solidity編譯器 :remix 、 java ide :idea。 智能合約編寫的我選擇在remix上方便,而且部署的時(shí)候不需要自定義gasP

    2024年01月16日
    瀏覽(25)
  • 玩以太坊鏈上項(xiàng)目的必備技能(初識(shí)智能合約語(yǔ)言-Solidity之旅一)

    玩以太坊鏈上項(xiàng)目的必備技能(初識(shí)智能合約語(yǔ)言-Solidity之旅一)

    前面一篇關(guān)于 智能合約 翻譯文講到了,是一種計(jì)算機(jī)程序,既然是程序,那就可以使用 程序語(yǔ)言 去編寫 智能合約 了。 而若想玩區(qū)塊鏈上的項(xiàng)目,大部分區(qū)塊鏈項(xiàng)目都是開(kāi)源的,能看得懂 智能合約 代碼,或找出其中的漏洞,那么,學(xué)習(xí) Solidity 這門高級(jí)的智能合約語(yǔ)言是有

    2023年04月16日
    瀏覽(27)
  • ganache私鏈部署智能合約+本地網(wǎng)絡(luò)Dapp

    ganache私鏈部署智能合約+本地網(wǎng)絡(luò)Dapp

    參考自(3條消息) 區(qū)塊鏈投票應(yīng)用:使用solidity+truffle+metamsk開(kāi)發(fā)Dapp應(yīng)用_一袋芋頭的博客-CSDN博客下載了項(xiàng)目示例webpack之后 ? 我們需要將里面的其他合約都刪除,也可以直接刪除這兩個(gè)文件夾里的內(nèi)容 ?然后就可以開(kāi)始正片了(當(dāng)然,你得先前就安裝好環(huán)境) 開(kāi)啟ganache私鏈,

    2024年02月08日
    瀏覽(19)
  • 以太坊私鑰介紹及生成與驗(yàn)證

    以太坊私鑰介紹及生成與驗(yàn)證

    1)私鑰格式 Bitcoin私鑰(或其他加密貨幣私鑰)有32 bytes,(或256個(gè)bit),或者其他形式表示,Base64 string、a WIF key、助記詞 2)為什么是32bytes 3)生成方法 3.1)原生方法 該方法不適合用于加密貨幣,因?yàn)樵摲椒ú话踩?;該方法基于隨機(jī)數(shù)種子生成,如果知道生成時(shí)的時(shí)間,容

    2024年02月15日
    瀏覽(18)
  • PoA以太私鏈搭建

    PoA以太私鏈搭建

    學(xué)習(xí)記錄 根據(jù)需要下載相應(yīng)版本的geth。 這里我用的是64位Windows版本,也就是圖片上第三個(gè)。下載完成后,點(diǎn)開(kāi),在電腦上完成安裝,并根據(jù)需要進(jìn)行環(huán)境變量的配置。 (1)驗(yàn)證geth是否安裝完成 win+R打開(kāi)cmd窗口,輸入 如果安裝成功,就會(huì)出現(xiàn)如下顯示 (2)創(chuàng)建賬戶 由于我

    2024年02月01日
    瀏覽(13)
  • 【使用go開(kāi)發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(04)

    【使用go開(kāi)發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(04)

    上一篇文章,我們完成了go連接區(qū)塊鏈的操作,本章我們將要完成獲取鏈上數(shù)據(jù),并持久化到數(shù)據(jù)庫(kù)的功能開(kāi)發(fā) 本系列文章 1、【使用go開(kāi)發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(01) 2、【使用go開(kāi)發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(02) 3、【使用go開(kāi)發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(03) 4、【使

    2024年02月12日
    瀏覽(24)
  • 【使用go開(kāi)發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(01)

    【使用go開(kāi)發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(01)

    在我們實(shí)際開(kāi)發(fā)項(xiàng)目中,很多時(shí)候都需要從鏈上獲取區(qū)塊數(shù)據(jù),將數(shù)據(jù)加工處理后存入到數(shù)據(jù)庫(kù)中,本章開(kāi)始,我們來(lái)學(xué)習(xí)一下如何從鏈上獲取數(shù)據(jù)(主動(dòng)拉?。┎⒋鎯?chǔ)到數(shù)據(jù)庫(kù)中 本系列文章 1、【使用go開(kāi)發(fā)區(qū)塊鏈】之獲取鏈上數(shù)據(jù)(01) 2、【使用go開(kāi)發(fā)區(qū)塊鏈】之獲取鏈

    2024年01月22日
    瀏覽(20)
  • go語(yǔ)言操作以太坊智能合約

    go語(yǔ)言操作以太坊智能合約

    操作中要注意版本問(wèn)題 geth版本、golang版本等 在remix環(huán)境中寫好合約后,進(jìn)行編譯得到abi文件 簡(jiǎn)單舉例 Hello.sol合約 編譯后abi文件(Hello.abi)內(nèi)容 然后需要一個(gè) abigen工具 可以將abi、bin等編譯后的智能合約文件內(nèi)容生成go代碼 abigen可以在geth官網(wǎng)下載geth的時(shí)候下載GethTools版本

    2024年02月09日
    瀏覽(21)
  • 【以太坊】私鏈搭上后無(wú)法MetaMask無(wú)法訪問(wèn)localhost8545的問(wèn)題

    【以太坊】私鏈搭上后無(wú)法MetaMask無(wú)法訪問(wèn)localhost8545的問(wèn)題

    私鏈搭好在Linux中,配置好ChianID和networkid等參數(shù)之后,使用MetaMask連接localhost8545仍然無(wú)法訪問(wèn): 這個(gè)問(wèn)題找了很久的資料,最后發(fā)現(xiàn)學(xué)習(xí)的資料是一年前的,文檔更新的速度趕不上以太坊更新的速度,原因是跑私鏈的命令行中缺失瀏覽器限制訪問(wèn)項(xiàng),之前的命令: 改之后的

    2024年02月11日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包