参考:https://www.jianshu.com/p/7e541cd67be2

部署智能合约的方法有很多,比如使用truffle框架,使用remix-ide等,在这里的部署方法是使用nodejs一步步编译部署实现的:

const Web3 = require('web3');
const web3 = new Web3();//使用web3来进行区块链接口的调用 //通过rpc连接区块链,这里连接的是本地私有链
web3.setProvider(new Web3.providers.HttpProvider(‘http://127.0.0.1:7545'));
const fs = require("fs");
const solc = require("solc");
let source = fs.readFileSync(“token.sol",'utf8');//读取sol智能合约文件
//对智能合约进行编译,第二个参数设置为1可以激活优化器optimiser
let compiledContract = solc.compile(source,1); for (let contractName in compiledContract.contracts) {
var bytecode = compiledContract.contracts[contractName].bytecode;//获得编译后合约的bytecode
var abi = JSON.parse(compiledContract.contracts[contractName].interface); //获得编译后合约的abi并写成json形式
} let gasEstimate = web3.eth.estimateGas({data:’0x’+bytecode});//获得这个合约部署大概所需的gas
let MyContract = web3.eth.contract(abi);

//上面是编译生成了Abi的方法,之后就有两种进行使用的情况:
(1)
//当从来没有部署过时,这里的gas例子上是gas:gasEstimate,但是我发现有些时候好像过小而不能成功,所以我每次为了保证能够绝对地成功,都设为一个很大的数,反正用不完会返回来的,你也可以设置为gas:gasEstimate,但是如果后面有发现有错误,很有可能是这里的问题

    var instance = MyContract.new(50,{from:user1,data:'0x'+bytecode,gas:47000000},function(e,contract){
if(typeof contract.address !== 'undefined'){
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
});

然后后面就可以使用instance来调用智能合约中的函数等信息了

(2)

//当已经在私有链上部署过时,里面的地址即为上面的方法得到的contract.address

let instance = MyContract.at('0x86757c9bdea10815e7d75a1577b6d9d2825dae0a');//可改

不过这种方式有一个问题,就是在发布合约时,你的私钥处于联网状态,
处于安全策略,我们需要尽量避免私钥在联网状态。

以太坊上部署合约是向空地址发送一个附有字节码的签名交易,其中发送者就是这个合约的拥有者。

因此我们只需要将合约构建成一笔交易,我们在无网状态下对这笔交易进行签名,然后将签名发送到以太坊网络中。这样能够降低我们私钥被泄漏的风险。
在这里要使用方法进行合约部署,参考:https://my.oschina.net/u/3794778/blog/1801897

web3.eth.sendRawTransaction(signedTransactionData [, callback])

参数:

    signedTransacionData: String - 16进制格式的签名交易数据。
callback: Function - 回调函数,用于支持异步的方式执行7。 返回值: String - 32字节的16进制格式的交易哈希串。 示例:
var Tx = require('ethereumjs-tx');//ethereumjs-tx 提供了私钥到公钥的转换方法
//你自己的私钥
var privateKey = new Buffer('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex');
//构造的交易中,是不需要包含 from 的,因为这个交易是通过私钥签名的,而私钥生成的签名是可以还原出公钥地址的,所以交易本身不需要冗余存储发送方信息。
var rawTx = {
//这个字段需要取你的发送账号所发起的交易的计数器,可以通过 eth_getTransactionCount 来获取当前的 nonce,直接用,不用加1
nonce: '0x00',
gasPrice: '0x09184e72a000',
gasLimit: '0x2710',
to: '0x0000000000000000000000000000000000000000', //to到空地址
value: '0x00', //可以省略
data: '0x7f7465737432000000000000000000000000000000000000000000000000000000600057'//就是之前生成的'0x'+bytecode
} var tx = new Tx(rawTx);
tx.sign(privateKey); var serializedTx = tx.serialize();

//这里得到的值就是需要的16进制格式的签名交易数据
//console.log(serializedTx.toString('hex'));
//0xf889808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000571ca08a8bbf888cfa37bbf0bb965423625641fc956967b81d12e23709cead01446075a01ce999b56a8a88504be365442ea61239198e23d1fce7d00fcfc5cd3b44b7215f web3.eth.sendRawTransaction(serializedTx.toString('hex'), function(err, hash) {
if (!err)
console.log(hash); // "0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385"这里得到的就是交易成功返回的交易hash
});

最后,生成的字节码可以直接到第三方,比如 https://etherscan.io/pushTx 来广播你的交易,如果广播失败,可以直接看到错误提示信息

下面这个网址是对etherscan这个工具的解释解释得很好,可以看看
http://8btc.com/thread-75748-1-7.html

nodejs部署智能合约的方法-web3 0.20版本的更多相关文章

  1. 如何用web3部署智能合约

    合约示例 pragma solidity ^0.4.18; contract CallMeChallenge { bool public isComplete = false; function ca ...

  2. 使用Truffle 部署智能合约

    使用Truffle 部署智能合约 之前我们使用Geth,原生的以太坊Golang工具,分析了创世区块的参数内容,在本地创建了私有以太坊区块链,并使用两个账户进行了挖矿和转账操作,对以太坊有了基本了解. ...

  3. Eth 部署智能合约

    首先要开发以太坊的智能合约,需要EVM(以太坊虚拟机),也就是需要运行的环境,我们可以通过 geth 来设置开发环境: geth --datadir testNet --dev console 2&g ...

  4. 在testrpc以太坊测试环境部署智能合约

    2018年03月13日 09:20:54 思无邪-machengyu 阅读数 2683   版权声明:本文为博主原创文章,转载请务必注明出处,否则追究法律责任 https://blog.csdn.ne ...

  5. 以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明

    以太坊智能合约开发,Web3.js API 中文文档 ethereum web3.js入门说明 为了让你的Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3.对象.底层实 ...

  6. Hadoop生态圈-通过CDH5.15.1部署spark1.6与spark2.3.0的版本兼容运行

    Hadoop生态圈-通过CDH5.15.1部署spark1.6与spark2.3.0的版本兼容运行 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我的CDH5.15.1集群中,默 ...

  7. 从零构建以太坊(Ethereum)智能合约到项目实战——第20章 搭建自己的私有链网络

    P75 .1-以太坊私网建立 .合约编译.部署完全教程(1) 使用此博文进行安装配置:https://blog.csdn.net/w88193363/article/details/79402074 ...

  8. web3部署智能合约碰到的一个奇怪问题

    都是gasLimit惹的祸 解决一个奇怪问题Error: Number can only safely store up to 53 bits 原来好好的node endpointtest.js ,结 ...

  9. day02 智能合约

    上午 1>部署智能合约网络 语法 require 2>利用第三方的节点 同步到以太坊 3>智能合约部署的步骤: 1.查看区块 2.发布合约 deploy后台经历的事情:就是部署合约的 ...

随机推荐

  1. 13 ,CSS 入门基础,行内排版内嵌式排版和外部排版样式

    1.认识 CSS 2.传统 HTML 设计网页版面的缺点 3.CSS 的特点 4.CSS 的排版样式 13.1 认识CSS CSS的英文全名是 Cascading Style Sheets,中文可翻译 ...

  2. 洛谷P4704 太极剑(乱搞)

    题意 题目链接 Sol 不会正解 写了发暴力过了,貌似跑的还挺快?.. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include< ...

  3. 2018-04-27 搭建Python官方文档翻译环境-汉化示例代码

    通过官方i18n流程, 实现文档中的代码段的汉化, 效果如下(4. More Control Flow Tools): 步骤 基于python官方3.6版文档cpython/Doc生成pot文件. 参 ...

  4. ViewPager结合view无限滑动

    使用viewPager进无限滑动,这里的实现是在适配器里面进行,当然在外头使用滑动监听也行. import android.support.v4.view.PagerAdapter; import a ...

  5. Python 关于xpath查找XML元素的一点总结

    关于xpath查找XML元素的一点总结 by:授客 QQ:1033553122   欢迎加入全国软件测试qq群:7156436   测试环境 Win7 64 python 3.4.0 实践出真知 代码 ...

  6. Android为TV端助力 同时setTag两次,保存多种值

    示例代码: view.setTag(R.string.action_settings,hodler.content); 接收两个值,一个是key值,必须是唯一值,而且要写在values/ids.xml ...

  7. 填坑:Windows下使用OpenSSL生成自签证书(很简单,一个晚上搞明白的,让后来者少走弯路)

    最近在学习中发现openssl 中有个坑,所有的教程都是openssl genrsa -des3 -out private.key 1024,但是产生的证书,npm start 之后就报错如下: er ...

  8. jsfiddle 使用教程

    最近有许多的Css 3 demo,因此为了方便查阅,就将demo部分放在jsfiddle ,方便日后翻阅. 这是 JSFIDDLE 的官网文档,都是英文,不过对照看还是可以的:官方文档 HTML区域: ...

  9. C# 枚举转列表

    using System; using System.Collections.Generic; using System.ComponentModel; namespace Common.Utils ...

  10. python设计模式之单例模式(转)

    设计模式之单例模式 单例设计模式是怎么来的?在面向对象的程序设计中,当业务并发量非常大时,那么就会出现重复创建相同的对象,每创建一个对象就会开辟一块内存空间,而这些对象其实是一模一样的,那么有没有办法 ...