Node.js web3.js编译、部署智能合约

2023-11-16

Node.js web3.js编译、部署智能合约

供参考脚本:https://github.com/Saturday24/Smart-Contracts-Script

1.编译脚本

	a.install -- web3 solc fs path 
	b.编译: node compiler.js

首先在工程目录下,使用node.jsfs模块,查找是否存在.sol格式的合约文件, 若存在:
则再去对应目录查找是否存在:与该合约对应的.abi、.json文件,根据需求,若不存在编译后的文件或合约代码已更改,则执行编译脚本,生成对应的.abi、.json文件。
:运行编译文件报错:原因一:fileName前需加 : ; 原因二:最新版solc编译生成.abi、.json文件时会报错,建议重新安装稳定版

2.部署脚本

  部署: node deploy.js

将.abi、.json文件以及所需参数传递给部署脚本,部署脚本,执行成功则返回合约地址,供前端调用。
:部署合约所消耗的gas可以通过调用web3的web3.eth.estimateGas()的方法来预估计算,并填入deploy函数中。

安装 Truffle - https://truffleframework.com/truffle
安装 Ganache - https://truffleframework.com/ganache

1.install – web3 solc fs path
2.编译: node compiler.js

var solc = require("solc")
var fs = require("fs")
var path = require('path')

function compiler(file,contractName){
    // 读取智能合约文件
    var input = fs.readFileSync(file,'utf8').toString();
    var fileName = path.parse(file)['name'].toString();
    console.log(fileName)
    // 编译合约
    var contract = solc.compile(input,1);
    // 输出结果   
	console.log(contract.contracts[contractName].interface)
    console.log(contract.contracts[contractName].bytecode)
    // 将编译后生成的bytecode保存到本地
    fs.writeFile(fileName+'.abi','0x'+contract.contracts[contractName].bytecode,{},function (err,result) {
        if (err){
            console.log(err)
        }
    })
    // 将编译后生成的interface保存到本地
    fs.writeFile(fileName+'.json',(contract.contracts[contractName].interface),{},function (err,result) {
        if (err){
            console.log(err)
        }
    })
}

// 调用函数,第一个参数是你的合约文件地址,第二个参数是你的合约名,注意冒号不要省略
compiler('./ballot.sol',':Ballot');

注:运行编译文件报错:
原因一:fileName前需加:
原因二:最新版solc编译生成.json.abi文件时会报错,重新安装稳定版;

3.部署合约: node deploy.js

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider(`ipfsAddress`));
var fs = require('fs');
var path = require('path')
deploy(`contractName`,`account[0]`,`psw`);
/*
@param file 文件名,会自动查找文件名路径下的被编译过的文件
@param from 合约账户,合约部署到私链上将从这个账户上扣除gas
@param password 该账户的密码,如果你账户是锁定状态
*/
function deploy(file,from,password) {
    var filename = path.parse(file)['name'].toString();
    var interface = fs.readFileSync(file+'.json').toString();
    var bytecode = fs.readFileSync(file+'.abi').toString();
    var MyContract = new web3.eth.Contract(JSON.parse(interface),{from:from,gasPrice:'1597262155',gas:3000000,data:bytecode});
    // 如果你的账户是未锁定状态,可以将这里去掉
//     web3.eth.personal.unlockAccount(from,password,function (err,result) {
//         if (result){
            // 只保留这些
            MyContract.deploy({
                data:bytecode,
            }).send({
                    from: from,
                    gas: 3000000,
                    gasPrice: '1597262155',
                    value:0
                },function (error,transactionHash) {
                    if (error)
                        console.log(error)
                    console.log(transactionHash)
                })
                .on('error', function (error) {
                    console.log(error)
                })
                .on('transactionHash',function (transactionHash) {
                    console.log(transactionHash)
                })
                .on('receipt',function (receipt) {
                    console.log(receipt)
                })
                .on("confirmation", function (confirmationNumber,receipt) {
                    console.log(confirmationNumber)
                    console.log(receipt)
                })
                .then(function(newContractInstance){
                    console.log(newContractInstance.options.address) // instance with the new contract address
                    // 将合约部署的地址保存到本地
                    fs.writeFile(filename+'address.txt',newContractInstance.options.address,{},function (err,result) {
                        if (err){
                            console.log(err)
                        }
                        console.log('contract address write into contractAddress.txt');
                    })
                });
//         }
//     })
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js web3.js编译、部署智能合约 的相关文章

  • k8s优雅停服

    在应用程序的整个生命周期中 正在运行的 pod 会由于多种原因而终止 在某些情况下 Kubernetes 会因用户输入 例如更新或删除 Deployment 时 而终止 pod 在其他情况下 Kubernetes 需要释放给定节点上的资源时

随机推荐

  • freeswitch录音功能开启无法通话

    freeswitch录音问题 之前开启过代理模式 在dialPlan default xml中添加
  • 初学Android,图形图像之打砖块游戏(二十八)

    这个弹球游戏是没有砖块的打砖块游戏 简版 效果如下 package WangLi Graphics PinBall import java util Random import java util Timer import java uti
  • 操作系统实验七-内存页面置换算法的设计和主存储器空间的分配和回收

    个人博客地址 实验1 内存页面置换算法的设计 一 实验内容 实现最近最久未使用 LRU 置换算法 二 实验目的 LINUX中 为了提高内存利用率 提供了内外存进程对换机制 内存空间的分配和回收均以页为单位进行 一个进程只需将其一部分调入内存
  • 云管平台 — vRealize Suite

    原文地址 https blogs vmware com china 2017 11 08 E4 BA 91 E7 AE A1 E5 B9 B3 E5 8F B0 vrealize suite vRealize Suite 是 vRealiz
  • 取余运算的意义

    取余运算的意义一般是给一个数一个界定范围 就比如m n 100 就限定了m的的范围只能是0 100 更形象来说 我们可以把它想象成一个圆环 我们扩大n 就像当于在0 100这个圈内打转 我们再稍微扩展一下 n 0 while true n
  • C/C++ C++20 格式化库 std::format

    说明 文本格式化库提供 printf 函数族的安全且可扩展的替用品 有意使之补充既存的 C I O 流库并复用其基础设施 例如对用户定义类型重载的流插入运算符 头文件 include
  • npm ERR! missing script dev

    刚刚npm install之后执行npm run dev 出现的报错信息npm ERR missing script dev 1 一种可能时vue init webpack的时候多建了一层文件夹 然后运行的时候没有找到package jso
  • MySQL--udf提权

    udf提权 udf user defined function 即 用户自定义函数 是通过添加新函数 对MYSQL的功能进行扩充 如何获得udf文件 将文件放到哪才能让mysql承认这个函数 函数功能 为什么这东西能提权 自定义函数指令是直
  • Netty-UDP协议

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 实现一个UDP应用关键的点 1 和tcp的不同 udp没有接收的说法 所以即使是接收端 也使用Bootstrap 2 指定channel为NioDatagramChanne
  • 汉字编码输入法综述

    2 汉字编码输入法综述 作者 戴石麟 sbxlm 126 com 本章打算分基础工作 理论研究和实用系统三个方面来对汉字编码输入技术的历史和现状进行综合评述 最后指出现有技术中存在的问题并预测今后技术的发展趋势 2 1基础工作 1974年8
  • java 导入自定义类

    eclipse导入很容易 昨天上课学了一下用记事本写java 导入自定义类 这就麻烦了 代码贴一下 方便操作 package tom jiafei public class SquareEquation double a b c doubl
  • 【SpringMVC】Jrebel 插件实现热部署与文件上传

    目录 一 JRebel 1 1 Jrebel介绍 1 2 Jrebel插件下载 1 3 Jrebel服务下载并启动 1 4 在线生成GUID 1 5 JRebel激活 1 6 相关设置 注意 二 文件上传 下载 2 1 导入pom依赖 2
  • MATLAB 拟合神经网络—— fitnet

    建立神经网络 语法 net fitnet hiddenSizes trainFcn hiddenSize 为隐藏层数 是一个行向量 分别表示从左到右的隐藏层神经元数 trainFcn 为训练函数 如下表所示 名称 函数 trainlm Le
  • go 进阶 go-zero相关: 三. go-zero 微服务基础示例

    目录 一 go zero 微服务基础 安装 ETCD 1 docker 安装运行etcd 2 windows 安装 etcd 二 go zero使用goctl命令创建一个普通的服务 三 go zero使用goctl命令创建一个rpc服务 1
  • python批量下载文件并压缩后上传到owncloud

    目录 1 首先获的一个保存url的文件 2 下载文件到服务器 3 将文件上传到owncloud 3 1 上传单个文件 3 2 上传多个文件 大文件拆分为小文件 推荐 摘要 笔者想下载东西到本地 直接下载速度超慢 一共需要下载1500张图 下
  • 每天进步一点点【图的深度优先遍历(DFS)】

    图是一种数据结构 其中节点可以具有零个或多个相邻元素 两个节点之间的连接称为边 节点也可以称为顶点 图分为三种 无向图 有向图 带权图 图的表示方式有两种 二维数组表示 邻接矩阵 链表表示 邻接表 邻接矩阵 邻接矩阵是表示图形中顶点之间相邻
  • 局域网使用kubeadm安装高可用k8s集群

    主机列表 ip 主机名 节点 cpu 内存 192 168 23 100 k8smaster01 master 2核 2G 192 168 23 101 k8smaster02 node 2核 2G 192 168 23 102 k8sma
  • 第三方支付自建商户池体系

    三方支付自建商户池体系通常指的是第三方支付机构自己搭建的商户池管理系统 商户池是指该支付机构所拥有的所有商户账户的集合 在支付领域 商户池的建立对于支付机构来说非常重要 它可以帮助支付机构更有效地管理商户 风控和支付流程 以下是自建商户池体
  • Animator的基本用法

    这里仅仅介绍Animator的一些基本的用法 说到Animator 最重要的最常用的的就是ObjectAnimator类 因为这个类可以对任意View的任意属性进行操作 首先以ImageView为例 以下所有的操作都针对ImageView
  • Node.js web3.js编译、部署智能合约

    Node js web3 js编译 部署智能合约 供参考脚本 https github com Saturday24 Smart Contracts Script 1 编译脚本 a install web3 solc fs path b 编