以太坊web3部署新合约(contract)

用nodejs实现,web3版本1.0.0beta,都是坑,直接上代码

#!/usr/bin/env node
//export NODE_PATH="/usr/lib/node_modules"
const Web3 = require('web3');
const Tx = require('ethereumjs-tx')
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('https://rinkeby.infura.io/...'));
var privateKey = new Buffer('...', 'hex')
//abi和bytecode通过solidity编译器命令行获取
var abi = JSON.parse('...');
var contract = new web3.eth.Contract(abi)
var bytecode = '0x...';
//钱包地址
var from = '0x...';
web3.eth.getGasPrice().then(function(gasPrice){
    const gasPriceHex = web3.utils.toHex(gasPrice);
    const gasLimitHex = web3.utils.toHex(1000000);
    web3.eth.getTransactionCount(from,function(err,nonce){
        const nonceHex = web3.utils.toHex(nonce);
        const t = {
            nonce: nonceHex,
            gasPrice: gasPriceHex,
            gasLimit: gasLimitHex,
            data: bytecode,
            from: from
        };
        var tx = new Tx(t);
        tx.sign(privateKey);
        var serializedTx = '0x' + tx.serialize().toString('hex');
        web3.eth.sendSignedTransaction(serializedTx,
        function(err, r) {
            if(!err){
                web3.eth.getTransaction(r,
                function(err, r) {
                    console.log(r)
                })
            }
        })
    })
})

gas数量自行评估,可以用mist先看一下。

以太坊 web3 转移代币 token

web3版本,1.0.0 beta,现阶段网上文档基本100%都是老版本,API差异很大,经过一番摸索猜测使用1.0.0搞定,provider使用的是https://rinkeby.infura.io。

web3文档写的很齐全,根据文档交易以太币没有问题(唯一需要注意的是必须先把account添加到wallet,这个文档中没写),转移代币就完全是另一回事了,转移代币的本质是操作合约的函数,因为几乎100%的JSON-RPC服务都不提供远程签名这类有风险的接口(自己搭建的服务貌似也不行,没有深入详细测试),所以必须要本地签名,文档上倒是有几个签名函数,但是绝对不会成功,目前不清楚文档中的几个签名函数是做什么用。

继续阅读