【web3】使用web3.js发布并执行智能合约

news2025/7/5 0:52:11

前言

昨天我们学习了使用 web3.js 库查询链上区块和交易的用法,今天我们来介绍一下使用 web3.js 与智能合约的交互。在学习本节前,你应该对智能合约有一定的了解。

智能合约的生命周期包括 创建发布执行 以及 销毁

  • 创建:在 Remix 中编写智能合约,编译生成 ABI 和 字节码文件。
  • 发布:对应 Remix 中的 Deploy 按钮的功能,也即 web3.js 中合约实例上的 deploy 方法。
  • 执行:对应web3.js 中合约实例上的 callsend 方法。
  • 销毁:在合约中使用 destruct(address) 方法销毁指定合约。

因此我们在使用 web3.js 与合约交互时也包括这几个步骤。

与合约交互

应用程序二进制接口(ABI)

应用程序二进制接口(ABI)相当于智能合约暴露出来的标准接口,通过这个接口可以将智能合约转换为别的应用程序中的对象实例。通过这个对象实例就可以与智能合约进行交互。

💡 ABI对象实例

  • 函数(functions)* type:函数类型。默认为 function ,也可能是 constructor* stateMutability:状态可变性。* payable* nonpayable* view* pure* inputs,outputs:函数输入输出的参数列表* name:函数名称* 事件(events)* type:event* inputs:输入对象列表,包括 name , type , indexed* anonymous:是否为匿名的

创建合约

在一个合约中,我们可以编写的内容:函数,结构体,构造函数,状态变量,事件,枚举类型等。一个合约想要部署到区块链,需要编译为字节码文件;一个合约想要被外部的应用程序(如DApp)访问,则需要编译为ABI文件,供应用程序调用。

  • 部署合约* 区块链上已经部署了智能合约,通过代码将JS中的合约与链上合约进行关联与交互。* 直接通过JS代码在区块链上部署一个新合约。

💡 部署新合约

  • new web3.eth.Contract(abi[, address]) 创建一个合约对象。* [contract].deploy() 部署合约:// 该过程等价于在Remix上部署合约const abi = [ { "inputs": [ { "internalType": "uint256", "name": "_number", "type": "uint256" } ], "name": "setNumber", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getNumber", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }]const contract = new web3.eth.Contract(abi, address)const data = '608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633fb5c1cb1461003b578063f2c9ecd814610057575b600080fd5b6100556004803603810190610050919061009d565b610075565b005b61005f61007f565b60405161006c91906100d9565b60405180910390f35b8060008190555050565b60008054905090565b60008135905061009781610103565b92915050565b6000602082840312156100b3576100b26100fe565b5b60006100c184828501610088565b91505092915050565b6100d3816100f4565b82525050565b60006020820190506100ee60008301846100ca565b92915050565b6000819050919050565b600080fd5b61010c816100f4565b811461011757600080fd5b5056fea26469706673582212206d42283bc640e62ba9095ff6f78d7e4a75272960a2332eff853e9968295e534664736f6c63430008070033' // The data field must be HEX encoded data.contract.deploy({data,}).send({from: '0x539CDB50CC507bF167e205d10Df87cd8c1827Af6',gas: 1000000, // GAS LIMITgasPrice: '120000'}, (err, res) => {console.log('res', err, res) // 返回transaction的hash}) #### 💡 与链上合约进行关联与交互
const address = '0x8B48aF1b46eFE178014CdD6c90f3DdfbDABC6d67' // 合约部署地址
const myContract = new web3.eth.Contract(abi, address)
console.log(myContract) 

调用合约函数

  • [contract].methods.[myMethod([params...])].call(options[, defaultBlock, callback]) 调用智能合约读(pure/view)函数。* params:函数的参数* options-Object(可选):* from-String(可选):调用交易的地址。* gasPrice(可选):交易的每个gas的价格。* gas(可选):交易的gas限制。
  • [contract].methods.[myMethod([params...])].send(options[, defaultBlock, callback]) 调用写函数,相当于发送了交易。* send方法的options-Object:* from-String:发送人地址* 返回结果触发事件:* transactionHash-String:发送交易且得到交易哈希值后立即触发。* receipt-Object:当收到交易收据时触发。合约收据带有的不是 logs ,而是以事件名为键,以事件本身为属性值的 events 。* confirmation-Number/Object:从区块被挖到的第一个区块确认开始,每次确认都会触发,直到第24次确认。触发时第一个参数为收到的确认数,第二个参数为收到的交易收据。* error:交易发送过程中出错时触发。如果交易被网络拒接且带有交易收据,第二个参数就是该交易收据。
const Web3 = require('web3')

let web3;
if (typeof web3 !== 'undefined') {web3 = new Web3(web3.currentProvider);
} else {// set the provider you want from Web3.providersweb3 = new Web3(new Web3.providers.HttpProvider("<http://localhost:7545>"));
}

const abi = [
	{
		"inputs": [
			{
				"internalType": "uint256",
				"name": "_number",
				"type": "uint256"
			}
		],
		"name": "setNumber",
		"outputs": [],
		"stateMutability": "nonpayable",
		"type": "function"
	},
	{
		"inputs": [],
		"name": "getNumber",
		"outputs": [
			{
				"internalType": "uint256",
				"name": "",
				"type": "uint256"
			}
		],
		"stateMutability": "view",
		"type": "function"
	}
]
const address = '0xf935e846633aF4b9079c8a63d4d3D5203d437ae1' // 合约部署地址
const myContract = new web3.eth.Contract(abi, address)

myContract.methods.setNumber(123).send({
	from: '0x73538146481643a4bAE6D5A97a407018c14E20C5'
}).on('receipt', (data) => {
	console.log(data)
})

myContract.methods.getNumber().call((err, res) => {
	console.log(res)
}) 

调用合约事件

事件:将输入参数记录到日志信息中

  • 区块链是一个由区块组成的列表,这些块的内容基本上时交易记录。每个交易都有一个附加的交易日志,事件结果存放在交易日志里。合约发出的事件,可以使用合约地址访问。
  • [myContract].getPastEvents(filter, config[, callback]) 执行事件查询。

总结

现在你已经正式踏入区块链前端的范畴,甚至能够开发简单的 DApp程序。接下来我将会介绍简单使用 Solidity 编写合约,并学习使用 hardhat 框架进行区块链开发。

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为云CDN,助力电商平台无惧流量洪峰

对于电子商务平台来说&#xff0c;接连不断的促销活动支撑着电子商务的基本运作&#xff0c;并且频率越来越高。618、双11、双12等越来越多的购物节创造了消费高峰&#xff0c;这就要求企业的网络基础设施能够承受住用户流量的洪峰。 目前&#xff0c;电子商务在网站运营上常常…

JavaWeb学习之MVC、jstl、El表达式06

目录 1.MVC:开发模式 2 mvc三层架构 2.EL表达式 1.使用 2.获取值 1.${域名称.键名} 2 ${键名} 3.隐式对象 3.jstl学习 1.概念 2.作用 3.使用步骤 4,常用的]STL标签 1.MVC:开发模式 1.jsp演变历史 1,早期只有servlet,只能使用response输出标签数据&#xff0c;非常…

艾美捷 24孔细胞划痕试验试剂盒检测原理说明

受伤的组织会引发一系列复杂而结构化的事件&#xff0c;以修复受损的组织区域这些事件可能包括血管生成因子增加血管化增殖和细胞外基质沉积&#xff0c;以及炎症免疫细胞的浸润破坏坏死组织的过程。伤口愈合过程开始于细胞向伤口&#xff0c;开始突出&#xff0c;迁移&#xf…

Html+JavaScript+Css 二手车价格评估系统设计开发

目录 一、系统设计技术及平台介绍 二、系统总体设计图 三、软件模块实现 3.1 登陆注册模块 3.2 主界面 3.3 车辆评估界面 3.4 评估记录界面 3.5 评估结果界面 3.6 个人信息界面 四、数据库实体设计 五、重置成本法简介 六、相关代码 6.1 登陆界面代码 6.2 主界面…

【TypeScript】TS安装与使用

目录 初识TypeScript TypeScript给JS添加类型支持的原因 TypeScript相比JS的优势 TS工具包的安装 TS文件的编译和运行 简化TS的运行步骤 初识TypeScript TypeScript&#xff08;简称&#xff1a;TS&#xff09;是JavaScript的超集&#xff08;JS有的TS都有&#xff09;。…

Python编程 制作一个超级浪漫的新年倒计时(附源代码)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.新年介绍 二.代码介绍 1.应用的技术 &#xff08;1&#xff09;Pyga…

Java项目:springboot电影推荐网站

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 springboot电影推荐网站。本系统采用企业级开发标准&#xff0c;使用SpringBoot架构&#xff0c;数据访问层采用Spring Data Jpa&#xff0c;业…

工具(二):Nginx 扩展 OpenResty

OpenResty 介绍OpenResty 原理Nginx 模块Nginx的 lua插载点案例 配置模板nginx.conf通过Lua找到静态文件 — 商品页通过Lua 获取 redis 只返回 — 库存test 其他Demo MysqlOps.luaRedisExtOps.luaredisOps.lua 辅助工具类说明 自动生成静态页FTP 工具 Nginx_有5大优点&#x…

职场经验:游戏测试的主要工作及主要流程

01 游戏测试主要内容 1、功能测试 功能测试是游戏测试中最常见的模式&#xff0c;主要测试方法为黑盒测试 功能测试主要用来验证功能是否符合需求设计 功能测试主要考虑正确性&#xff0c;而不考虑游戏底层结构及代码错误 功能测试通常从界面着手开始测试&#xff0c;尽量…

【架构师(第五十一篇)】 服务端开发之技术方案设计

接口设计 把 server 端当做一个黑盒&#xff0c;它将如何与前端通讯&#xff1f; 功能范围 B 端&#xff0c;用户注册&#xff0c;作品管理&#xff0c;模板管理编辑器&#xff0c;单个作品的内容获取&#xff0c;修改&#xff0c;预览和发布 功能拆分 用户信息相关作品管…

线上牛奶配送

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 基于Java的线上牛奶配送系统的设计与实现 风网站前台&#xff1a;网站介绍、联系我们、公告信息、套餐类型、牛奶套餐、…

Linux-4 文件管理

Linux-4 文件管理 文件管理概述 谈到Linux文件管理&#xff0c;首先我们需要了解的是&#xff0c;我们要对文件做些什么事&#xff1f;其实无非就是对一个文件进行创建&#xff0c;复制&#xff0c;移动&#xff0c;查看&#xff0c;编辑&#xff0c;压缩&#xff0c;查找&am…

自己个人拥有一个可以支付功能的网站?当然可以了!保姆级演示!

文章目录前提条件演示应用申请开通和配置应用创建应用配置代码开发后端实例前端代码实例源码前提条件 这是必要条件&#xff01;&#xff01;&#xff01; 这是必要条件&#xff01;&#xff01;&#xff01; 这是必要条件&#xff01;&#xff01;&#xff01; 开通当面付&am…

人脸检测和对齐算法MTCNN

1. 概述 人脸识别在实际的生活中有着广泛的应用&#xff0c;得益于深度学习的发展&#xff0c;使得人脸识别的准确率得到大幅度提升。然而&#xff0c;为了做好人脸识别&#xff0c;第一步需要做的是对人脸检测&#xff0c;主要是通过对图片分析&#xff0c;定位出图片中的人脸…

Java项目:springboot网上点餐系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 功能介绍 SpringBoot在线订餐系统项目。主要功能说明&#xff1a; 分为两个角色&#xff0c;餐厅老板、普通用户 餐厅老板可以登录&#xff0c;注册&…

质量不错的蓝牙耳机有哪些?2023年值得选购的四款蓝牙耳机

现如今&#xff0c;蓝牙耳机越多人使用&#xff0c;不同于有线耳机&#xff0c;蓝牙耳机更为方便&#xff0c;没有线束的困扰&#xff0c;走到哪也不用带上手机一起&#xff0c;特别便利。然而&#xff0c;随着蓝牙耳机市场的旷大&#xff0c;各种类型各种样式的耳机五花八门&a…

C++ 实现并查集结构

前言 并查集一般用于多元素&#xff0c;多集合的查找问题&#xff1b; 听说很有用&#xff0c;但是平时好像确实没有怎么见过。。 leetcode典型例题&#xff1a;岛屿数量 一、原理 其实并查集的每个小集合就是一张有向图&#xff0c;只不过是所有子节点指向父节点的图结构。…

认证鉴权对于 API 网关的重要性

认证鉴权作为 API 网关不可或缺的能力&#xff0c;已然成为用户在选型 API 网关时考量的重要因素之一。 作者钱勇&#xff0c;API7.ai 开发工程师&#xff0c;Apache APISIX Committer 在当下云原生越发成熟的环境下&#xff0c;API 网关最核心的功能可以概括为&#xff1a;连接…

高品质蓝牙耳机排行榜,值得入手的四款蓝牙耳机分享

2023年即将到来&#xff0c;还有哪些蓝牙耳机值得大家购买呢&#xff1f;蓝牙耳机在我们日常生活中发挥着很大作用。无论是听歌还是通话&#xff0c;又或者是运动健身、玩游戏等&#xff0c;都常见大家使用。同样也伴随着蓝牙耳机市场的壮大&#xff0c;五花八门的耳机层出不穷…

【C语言进阶】进来抄作业,完善你的通讯录(软工期末大作业可用)

目录 &#x1f970;前言&#x1f970;&#xff1a; 一、输入合法性检测&#x1f920;&#xff1a; ①.对“ 联系方式 ”的合法性检测&#xff1a; ②.对“年龄”进行合法性检测&#xff1a; 二、字典排序&#x1f911;&#xff1a; 三、反馈优化&#x1f92f;&#xff1a; …