当前位置: 首页 > news >正文

网站seo优化关键词快速排名上首页搜索引擎seo优化

网站seo优化关键词快速排名上首页,搜索引擎seo优化,网站的开发技术,盘锦做网站的公司如果不是只读取数据的合约函数,需要异步的执行,因此并不能直接获取到合约函数的返回值,需要等到交易执行完毕,得到确认后才能获取到合约函数的返回值。而且合约函数返回值一般是通过事件日志获取到的。 这里给出一个例子来展示我…

如果不是只读取数据的合约函数,需要异步的执行,因此并不能直接获取到合约函数的返回值,需要等到交易执行完毕,得到确认后才能获取到合约函数的返回值。而且合约函数返回值一般是通过事件日志获取到的。

这里给出一个例子来展示我是如何获取合约函数返回值的。
我使用的以太坊版本为:github.com/ethereum/go-ethereum v1.13.0

solidity合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract StoreString {event ItemSetStr(bytes32 indexed hash,string key,string value);mapping (string => string) public itemstr;function setItemstr(string memory _key, string memory _value) external returns(bytes32){itemstr[_key] = _value;bytes32 hash=sha256(abi.encodePacked(_key,_value));emit ItemSetStr(hash,_key,_value);return hash;}
}

这是一个存储键值对的合约,利用函数setItemstr向map中存储键值对,并通过key,value计算哈希值,要求返回哈希值。通过事件ItemSetStr将哈希值(返回值)、key、value记录下来。

将合约的abi编码通过abigen工具生成go代码后。
以下是测试获取合约函数返回值的代码:

func TestSetStoreString(t *testing.T) {url="" //节点链接client, err := ethclient.Dial(url)if err != nil {log.Fatal(err)}//合约地址contractAddress := common.HexToAddress("0xd9Ed5E352F84E182eB499ae1b5F9935C06d78Ddb")privateKeyStr := "" //私钥字符串auth := InitAuth(privateKeyStr, client, nil)//得到合约实例storeString, err := NewStoreString(contractAddress, client)if err != nil {log.Fatal("NewStoreString: ", err)}tx, err := storeString.SetItemstr(auth, "key10", "9900")if err != nil {log.Fatal("SetItemstr: ", err)}//等待交易确认,获取到交易的收据receipt, err := bind.WaitMined(context.Background(), client, tx)if err != nil {log.Fatal("WaitMined: ", err)}//如果交易成功if receipt.Status == 1 {//解析该交易收据里包含的日志eventItemSetStr, err := storeString.ParseItemSetStr(*receipt.Logs[0])if err != nil {log.Fatal("ParseItemSetStr: ", err)}fmt.Println("交易成功!")fmt.Println("txHash:", tx.Hash().Hex())fmt.Println("返回值:", eventItemSetStr.Hash)fmt.Println("日志Key:", eventItemSetStr.Key)fmt.Println("日志Value:", eventItemSetStr.Value)} else {t.Error("交易失败")}}func InitAuth(privateKeyStr string, client *ethclient.Client, value *big.Int) *bind.TransactOpts {privateKeyECDSA, err := crypto.HexToECDSA(privateKeyStr)if err != nil {log.Fatal("crypto.HexToECDSA: ", err)}chainID, err := client.ChainID(context.Background())if err != nil {log.Fatal("ChainID: ", err)}auth, err := bind.NewKeyedTransactorWithChainID(privateKeyECDSA, chainID)if err != nil {log.Fatal("NewKeyedTransactorWithChainID: ", err)}//设置交易参数,例如gas费等,这里全部由区块链系统评估决定auth.GasFeeCap = big.NewInt(1).Mul(big.NewInt(10), big.NewInt(1000000000)) // maxFee Per Gas:100gwei//获取平均小费gasTipCap, err := client.SuggestGasTipCap(context.Background())if err != nil {log.Fatal("SuggestGasTipCap: ", err)}auth.GasTipCap = gasTipCap //priorityfee Per Gas:auth.GasLimit = uint64(3000000)//还需要设置锁定金额auth.Value = valuereturn auth
}

返回值并不能立马获得,需要等待交易成功上链。再从事件日志中解析出返回值。因此这个过程中用到了两个重要代码:

bind包下的WaitMined:等待tx交易的确认,并获取其收据,该收据中必然包含我们想要的日志

func WaitMined(ctx context.Context, b DeployBackend, tx *types.Transaction) (*types.Receipt, error)

合约代码自动生成的go文件中的ParseItemSetStr,传入日志即可解析出信息。

func (_StoreString *StoreStringFilterer) ParseItemSetStr(log types.Log) (*StoreStringItemSetStr, error)
http://www.wangmingla.cn/news/147558.html

相关文章:

  • 绵阳建设网站百度快照收录
  • 在中国做博彩网站违法吗百度关键词优化曝光行者seo
  • 网站 建设设计方案百度推广营销方案
  • 用美国服务器做网站会被墙吗比百度还强大的搜索引擎
  • 企业商务网站优化seo网络推广是干嘛的
  • 上海网站建设公司网站建设江门网站建设模板
  • 大理州住房和城乡建设局官方网站自动交换友情链接
  • 商务网站建设策划思路鞍山seo优化
  • 电子商务网站建设与管理课后题答案信息互联网推广
  • 卫生局网站建设方案营销策略范文
  • 丽水网站建设智能营销方法
  • 深圳做营销网站新网站怎么做优化
  • 多个链接的网站怎么做线上推广平台都有哪些
  • 北京网站营销与推广百度搜索推广流程
  • 网站建设与管理课后总结开网站需要多少钱
  • Wordpress分享到微信图标五种关键词优化工具
  • 龙华营销型网站建设公司seo搜索引擎排名优化
  • 网站建设与管理代码网站关键词快速优化
  • 有做义工的相亲网站吗常用的关键词挖掘工具有哪些
  • 东宁网站制作互联网推广渠道
  • 本地主机 搭建网站十大计算机培训机构排名
  • 网站开发目标百度贴吧网页入口
  • 淄博seo网站排名优化互联网营销师培训教程
  • 轻松学做网站企业网站推广方案设计毕业设计
  • 个人企业网站怎么建设推广普通话文字素材
  • 手机网站怎么改成电脑版一个人怎么做独立站shopify
  • 东莞做网站的公司有哪些嵌入式培训
  • 兰州网站建设慕枫seo实战密码第四版
  • 做网站编辑怎么样网络营销的重要性与意义
  • 网站收录下降的原因企业网站制作需要多少钱