精华内容
下载资源
问答
  • web3.js版本0.14.0支持对象的。 要迁移到此版本,请按照指南进行操作: - var web3 = require('web3'); + var Web3 = require('web3'); + var web3 = new Web3(); 以太坊JavaScript API 这是实现规范的与以太坊...
  • Web3.js 是 Ethereum 兼容的 JavaScript API,实现通用 JSON RPC 规范。 Web3.js 在 npm 里作为一个节点模块
  • $ yarn add @solana/web3.js npm $ npm install --save @solana/web3.js 浏览器捆绑 <!-- Development (un-minified) --> < script src =" https://unpkg.com/@solana/web3.js@0.92.0/lib/index.iife.js ...
  • web3.js-以太坊JavaScript API 这是连接到规范的以太坊 。 您需要运行本地或远程节点才能使用此库。 请阅读以获取更多信息。 安装 节点 npm install web3 纱 yarn add web3 在浏览器中 使用预构建的dist/web3.min...
  • Web3-基础 Web3.js是一个与以太坊区块链连接的javascript库。 结帐库
  • web3.js是连接到通用JSON-RPC规范的以太坊JavaScript API。 它由一系列库组成,这些库可以使用HTTP或IPC连接与本地或远程以太坊节点进行交互。 该节点可以是本地的,由DApp提供商托管,也可以是运行免费以太坊访问点...
  • Api-web3.js.zip

    2019-09-18 09:28:02
    Api-web3.js.zip,以太坊javascript apiweb3.js-以太坊javascript api,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api...
  • 快速学习-web3.js简介与入门

    千次阅读 2020-04-15 09:46:17
    web3.js 是一个JavaScript API库。要使DApp在以太坊上运行,我们可以使用web3.js库提供的web3对象 web3.js 通过RPC调用与本地节点通信,它可以用于任何暴露了RPC层的以太坊节点 web3 包含 eth 对象 - web3.eth(专门...

    web3.js简介与入门

    web3.js简介

    • Web3 JavaScript app API
    • web3.js 是一个JavaScript API库。要使DApp在以太坊上运行,我们可以使用web3.js库提供的web3对象
    • web3.js 通过RPC调用与本地节点通信,它可以用于任何暴露了RPC层的以太坊节点
    • web3 包含 eth 对象 - web3.eth(专门与以太坊区块链交互)和 shh 对象 - web3.shh(用于与 Whisper 交互)

    web3 模块加载

    • 首先需要将 web3 模块安装在项目中:npm install web3@0.20.1
    • 然后创建一个 web3 实例,设置一个“provider” • 为了保证我们的 MetaMask 设置好的 provider 不被覆盖掉,在引入 web3 之前我们一般要做当前环境检查(以v0.20.1为例):
    if (typeof web3 !== 'undefined') {
    	web3 = new Web3(web3.currentProvider);
    } else {
    	web3 = new Web3(new Web3.providers
    		.HttpProvider("http://localhost:8545"));
    }
    

    异步回调(callback)

    • web3js API 设计的最初目的,主要是为了和本地 RPC 节点共同使用,所以默认情况下发送的是同步 HTTP 请求
    • 如果要发送异步请求,可以在函数的最后一个参数位置上,传入一个回调函数。回调函数是可选(optioanl)的
    • 我们一般采用的回调风格是所谓的“错误优先”,例如:
    web3.eth.getBlock(48, function(error, result) {
    	if (!error)
    		console.log(JSON.stringify(result));
    	else
    		console.error(error);
    });
    

    回调 Promise 事件(v1.0.0)

    为了帮助 web3 集成到不同标准的所有类型项目中,1.0.0 版本提供了多种方式来处理异步函数。大多数的 web3 对象允许将一个回调函数作为最后一个函数参数传入,同时会返回一个promise 用于链式函数调用。

    • 以太坊作为一个区块链系统,一次请求具有不同的结束阶段。为了满足这样的要求,1.0.0 版本将这类函数调用的返回值包成一个“承诺事件”(promiEvent),这是一个 promise 和EventEmitter 的结合体。
    • PromiEvent 的用法就像 promise 一样,另外还加入了.on,.once 和.off方法
    web3.eth.sendTransaction({
    		from: '0x123...',
    		data: '0x432...'
    	})
    	.once('transactionHash', function(hash) { ...
    	})
    	.once('receipt', function(receipt) { ...
    	})
    	.on('confirmation', function(confNumber, receipt) { ...
    	})
    	.on('error', function(error) { ...
    	})
    	.then(function(receipt) { // will be fired once the receipt is mined });
    

    应用二进制接口(ABI)

    web3.js 通过以太坊智能合约的 json 接口(Application Binary Interface,ABI)创建一个 JavaScript 对象,用来在 js 代码中描述

    函数(functions)

    • type:函数类型,默认“function”,也可能是“constructor”
    • constant, payable, stateMutability:函数的状态可变性
    • inputs, outputs: 函数输入、输出参数描述列表

    事件(events)

    • type:类型,总是“event”
    • inputs:输入对象列表,包括 name、type、indexed

    批处理请求(batch requests)

    • 批处理请求允许我们将请求排序,然后一起处理它们。
    • 注意:批量请求不会更快。实际上,在某些情况下,一次性地发出许多请求会更快,因为请求是异步处理的。
    • 批处理请求主要用于确保请求的顺序,并串行处理。
    var batch = web3.createBatch();
    batch.add(web3.eth.getBalance.request('0x0000000000000000
    			000000000000000000000000 ', '
    			latest ', callback)); 
    			batch.add(web3.eth.contract(abi).at(address).balance.request(a ddress, callback2)); batch.execute();
    

    大数处理(big numbers)

    • JavaScript 中默认的数字精度较小,所以web3.js 会自动添加一个依赖库 BigNumber,专门用于大数处理
    • 对于数值,我们应该习惯把它转换成 BigNumber 对象来处理
    var balance = new 
    BigNumber('131242344353464564564574574567456');
    // or var balance = web3.eth.getBalance(someAddress); 
    balance.plus(21).toString(10); 
    //"131242344353464564564574574567477"
    
    • BigNumber.toString(10) 对小数只保留20位浮点精度。所以推荐的做法是,我们内部总是用 wei 来表示余额(大整数),只有在需要显示给用户看的时候才转换为ether或其它单位

    常用 API —— 基本信息查询

    查看 web3 版本

    • v0.2x.x:web3.version.api
    • v1.0.0:web3.version 查看 web3 连接到的节点版本(clientVersion) • 同步:web3.version.node

    异步:

    web3.version.getNode((error,result)=>{console.log(result)})
    
    • v1.0.0:web3.eth.getNodeInfo().then(console.log)

    基本信息查询

    获取 network id

    • 同步:web3.version.network
    • 异步:web3.version.getNetwork((err, res)=>{console.log(res)})
    • v1.0.0:web3.eth.net.getId().then(console.log)

    获取节点的以太坊协议版本

    • 同步:web3.version.ethereum
    • 异步:web3.version.getEthereum((err, res)=>{console.log(res)})
    • v1.0.0:web3.eth.getProtocolVersion().then(console.log)

    网络状态查询

    是否有节点连接/监听,返回true/false

    • 同步:web3.isConnect() 或者 web3.net.listening
    • 异步:web3.net.getListening((err,res)=>console.log(res))
    • v1.0.0:web3.eth.net.isListening().then(console.log)

    查看当前连接的 peer 节点

    • 同步:web3.net.peerCount\
    • 异步:web3.net.getPeerCount((err,res)=>console.log(res))
    • v1.0.0:web3.eth.net.getPeerCount().then(console.log)

    Provider

    查看当前设置的 web3 provider

    • web3.currentProvider

    查看浏览器环境设置的 web3 provider(v1.0.0)

    • web3.givenProvider

    设置 provider

    • web3.setProvider(provider)
    • web3.setProvider(new web3.providers.HttpProvider(‘http://localhost:8545’))

    web3 通用工具方法

    以太单位转换

    • web3.fromWei web3.toWei

    数据类型转换

    • web3.toString web3.toDecimal web3.toBigNumber

    字符编码转换

    • web3.toHex web3.toAscii web3.toUtf8 web3.fromUtf8

    地址相关

    • web3.isAddress web3.toChecksumAddress

    web3.eth – 账户相关

    coinbase 查询

    • 同步:web3.eth.coinbase
    • 异步:web3.eth.getCoinbase( (err, res)=>console.log(res) )\
    • v1.0.0:web3.eth.getCoinbase().then(console.log)

    账户查询

    • 同步:web3.eth.accounts
    • 异步:web3.eth.getAccounts( (err, res)=>console.log(res) )
    • v1.0.0:web3.eth.getAccounts().then(console.log)

    区块相关

    区块高度查询

    • 同步:web3.eth. blockNumber
    • 异步:web3.eth.getBlockNumber( callback )

    gasPrice 查询

    • 同步:web3.eth.gasPrice
    • 异步:web3.eth.getGasPrice( callback )

    区块查询

    • 同步:web3.eth.getBlockNumber( hashStringOrBlockNumber [ ,returnTransactionObjects] )
    • 异步:web3.eth.getBlockNumber( hashStringOrBlockNumber, callback )

    块中交易数量查询

    • 同步:web3.eth.getBlockTransactionCount( hashStringOrBlockNumber )
    • 异步:web3.eth.getBlockTransactionCount( hashStringOrBlockNumber, callback )

    交易相关

    余额查询

    • 同步:web3.eth.getBalance(addressHexString [, defaultBlock])
    • 异步:web3.eth.getBalance(addressHexString [, defaultBlock ] , callback])

    交易查询

    • 同步:web3.eth.getTransaction(transactionHash)
    • 异步:web3.eth.getTransaction(transactionHash [, callback])

    交易执行相关

    交易收据查询(已进块)

    • 同步:web3.eth.getTransactionReceipt(hashString)
    • 异步:web3.eth.getTransactionReceipt(hashString [,

    callback])

    • 估计 gas 消耗量
    • 同步:web3.eth.estimateGas(callObject)
    • 异步:web3.eth.estimateGas(callObject [, callback])

    发送交易

    • web3.eth.sendTransaction(transactionObject [, callback])

    交易对象:

    • from:发送地址
    • to:接收地址,如果是创建合约交易,可不填
    • value:交易金额,以wei为单位,可选
    • gas:交易消耗 gas 上限,可选
    • gasPrice:交易 gas 单价,可选
    • data:交易携带的字串数据,可选
    • nonce:整数 nonce 值,可选

    消息调用

    • web3.eth.call(callObject [, defaultBlock] [, callback])

    参数:

    • 调用对象:与交易对象相同,只是from也是可选的
    • 默认区块:默认“latest”,可以传入指定的区块高度
    • 回调函数,如果没有则为同步调用
    var result = web3.eth.call({
    			to: "0xc4abd0339eb8d57087278718986382264244252f",
    			data: "0xc6888fa100000000000000000000000000000000000000000000000000
    			0 0000000000003 " }); 
    			console.log(result);
    

    日志过滤(事件监听)

    web3.eth.filter(filterOptions[, callback])
    // filterString 可以是 'latest' or 'pending' 
    var filter = web3.eth.filter(filterString);
    // 或者可以填入一个日志过滤 options 
    var filter = web3.eth.filter(options);
    // 监听日志变化
    filter.watch(function(error, result) {
    	if (!error) console.log(result);
    });
    // 还可以用传入回调函数的方法,立刻开始监听日志
    web3.eth.filter(options, function(error, result) {
    	if (!error) console.log(result);
    });
    

    合约相关 —— 创建合约

    web3.eth.contract
    var MyContract = web3.eth.contract(abiArray);
    // 通过地址初始化合约实例
    var contractInstance = MyContract.at(address);
    // 或者部署一个新合约
    var contractInstance = MyContract.new([constructorParam1]
    	[, constructorParam2], {
    		data: '0x12345...',
    		from: myAccount,
    		gas: 1000000
    	});
    

    调用合约函数

    • 可以通过已创建的合约实例,直接调用合约函数
    // 直接调用,自动按函数类型决定用 sendTransaction 还是 call
    myContractInstance.myMethod(param1[, param2, ...][,
    	transactionObject
    ][, defaultBlock][, callback]);
    // 显式以消息调用形式 call 该函数
    myContractInstance.myMethod.call(param1[, param2, ...][,
    	transactionObject
    ][, defaultBlock][, callback]);
    // 显式以发送交易形式调用该函数
    myContractInstance.myMethod.sendTransaction(param1[,
    	param2, ...][, transactionObject][, callback]);
    

    监听合约事件

    • 合约的 event 类似于 filter,可以设置过滤选项来监听
    var event = myContractInstance.MyEvent({
    		valueA: 23
    	}
    	[, additionalFilterObject])
    // 监听事件
    event.watch(function(error, result) {
    	if (!error) console.log(result);
    });
    //还可以用传入回调函数的方法,立刻开始监听事件
    var event = myContractInstance.MyEvent([{
    		valueA: 23
    	}]
    	[, additionalFilterObject],
    	function(error, result) {
    		if (!error) console.log(result);
    	}
    );
    
    展开全文
  • web3-示例 使用Web3.js在BSC上发送事务
  • 一、前言 1、web3.js文档 http://web3js.readthedocs.io/en/1.0/ 前面的文章也提到了,使用web3.js可以与以太坊进行互动。这篇文章的主要内容如下: ...现在使用npm install web3安装的web3.js,...

    一、前言

    1、web3.js文档
    http://web3js.readthedocs.io/en/1.0/

    前面的文章也提到了,使用web3.js可以与以太坊进行互动。这篇文章的主要内容如下:

    解决web3.js版本问题

    二、使用web3.js查询以太币及代币余额,以及进行以太币和代币转账

    1.web3.js版本问题

    现在使用npm install web3安装的web3.js,会发现node_modules中的web3文件夹中,没有dist文件夹,而查看package.json内容如下:

    {
      "name": "111",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "dependencies": {
        "web3": "^1.0.0-beta.34"
      }
    }

    会发现web3的版本为”^1.0.0-beta.34”。

    官方文档有这么一句话:

          大意是这篇文档还在补全中,并且1.0版本的包还没放出。如果要查看当前的0.x.x版本的文档,请戳这里https://github.com/ethereum/wiki/wiki/JavaScript-API。我估计这是web3文件夹没有dist文件夹以及web3.min.js的原因。

          之前的文章《以太开发交互实战》也有提供了下载缺失包的地址,但是下载下来的web3.min.js很可能是0.20.6版本的。因为根据当前1.0官方文档进行使用,很多方法运行会出现找不到此方法的错误信息。而我们的package.json的web3的版本又是”^1.0.0-beta.34”,所以干脆直接去下载1.0.0-beta.34版本的缺失包使用,还可以就着1.0版本的文档食用。

    1.1 下载1.0.0-beta.34版本的web3.min.js

          首先进入https://github.com/ethereum/web3.js,点击Branch,切换到Tags选项,点击v1.0.0-beta.34,然后download代码,将dist文件夹拷贝到自己项目的moudles的web3文件夹下即可。

    2. 使用web3.js查询以太币及代币余额以及进行以太币和代币转账
    2.1 在私链和主链上查询以太币及代币余额
    查询类方法在私链和主链上的方法都是一样的,说明以下几点:

    主链地址。可以去infura申请

    contractAbi。合约的abi。可以去https://etherscan.io获取,如果代币合约提供了code,就会有abi

    // 引入web3
    var Web3 = require('web3');
    if (typeof web3 !== 'undefined') {
        web3 = new Web3(web3.currentProvider);
    } else {
        // web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
        web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/yourAddress"));
    }
    
    // 定义合约abi
    var contractAbi = [{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}];
    
    // 合约地址
    var contractAddress = "0x7FCCF800568747b178c6cBbe4Bf3d147df75ac61";
    
    // 账号
    var currentAccount = "0x4e9d5c58d8d6f02FFe5A6EF10CB804FfFB556bBb";
    
    // 定义合约
    var myContract = new web3.eth.Contract(contractAbi, contractAddress, {
        from: currentAccount, // default from address
        gasPrice: '10000000000' // default gas price in wei, 10 gwei in this case
    });
    
    // 查询以太币余额
    web3.eth.getBalance(currentAccount).then(console.log);
    
    // 查看某个账号的代币余额
    myContract.methods.balanceOf(contractAddress).call({from: currentAccount}, function(error, result){
        if(!error) {
            console.log(result);
        } else {
            console.log(error);
        }
    });

          举一反三,这里还可以查询代币的名称,符号,小数位,发行总量等等,因为代币合约一般都符合ERC标准,都有这些基本方法。甚至如果你有合约代码和abi,还可以调用合约的其他方法,当然调用有些方法需要权限及前置条件。

    // 获得代币名称
    myContract.methods.name().call({from: currentAccount}, function(error, result){
        if(!error) {
              console.log(result);
        } else {
          console.log(error);
        }
    });
    // 获取代币符号
    myContract.methods.symbol().call({from: currentAccount}, function(error, result){
        if(!error) {
          console.log(result);
         } else {
          console.log(error);
         }
    });
    // 获取代币总量
    myContract.methods.totalSupply().call({from: currentAccount}, function(error, result){
        if(!error) {
          console.log(result);
         } else {
          console.log(error);
         }
    });
    // 查看某个账号允许另一个账号可使用的代币数量
    myContract.methods.allowance(sender, spender).call({from: currentAccount}, function(error, result){
        if(!error) {
          console.log(result);
         } else {
          console.log(error);
         }
    });

    2.2 在私链上转账以太币及代币

    // 以太币转账
    web3.eth.sendTransaction({
        from: currentAccount,
        to: receiverAccount,
        value: '1000000000000000'
    })
    .then(function(receipt){
        console.log(receipt);
    });
    
    // 代币转账
    myContract.methods.transfer(to, amount).send({from: currentAccount}), function(error, transactionHash){
        if(!error) {
           console.log('transactionHash is ' + transactionHash);
        } else {
           console.log(error);
        }
    });

    2.2 在主链上转账以太币及代币

          上面的方法只适用于私链。因为你在私链的账户在本地是有私钥的。而在主链上要进行写入数据的方法,是需要获取账户的私钥并对交易进行签名的,所以要用到web3.eth.sendSignedTransaction方法。

    文档http://web3js.readthedocs.io/en/1.0/web3-eth.html#sendsignedtransaction

    方法稍微有点复杂,建议先查看底部的参考文章。因为有些重复的内容这里就不再解释了。

    需要npm安裝'ethereumjs-tx'
    
    npm install ethereumjs-tx
    以太币转账
    
    // 引入ethereumjs-tx
    var Tx = require('ethereumjs-tx');
    
    // 以太币转账    
    // 先获取当前账号交易的nonce
    web3.eth.getTransactionCount(currentAccount, web3.eth.defaultBlock.pending).then(function(nonce){
    
    
        // 获取交易数据
        var txData = {
            // nonce每次++,以免覆盖之前pending中的交易
            nonce: web3.utils.toHex(nonce++),
            // 设置gasLimit和gasPrice
            gasLimit: web3.utils.toHex(99000),   
            gasPrice: web3.utils.toHex(10e9),  
            // 要转账的哪个账号  
            to: '0x3b11f5CAB8362807273e1680890A802c5F1B15a8',
            // 从哪个账号转
            from: currentAccount,
            // 0.001 以太币
            value: web3.utils.toHex(10e14),         
            data: ''
        }
    
        var tx = new Tx(txData);
    
        // 引入私钥,并转换为16进制
        const privateKey = new Buffer('your account privateKey', 'hex'); 
    
        // 用私钥签署交易
        tx.sign(privateKey);
    
        // 序列化
        var serializedTx = tx.serialize().toString('hex');
    
        web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
            if (!err) {
                console.log(hash);
            } else {
                console.error(err);
            }
        });
    });
    代币转账
    
    // 补齐64位,不够前面用0补齐
    function addPreZero(num){
      var t = (num+'').length,
      s = '';
      for(var i=0; i<64-t; i++){
        s += '0';
      }
      return s+num;
    }
    
    web3.eth.getTransactionCount(currentAccount, web3.eth.defaultBlock.pending).then(function(nonce){
    
        // 获取交易数据
        var txData = {
            nonce: web3.utils.toHex(nonce++),
            gasLimit: web3.utils.toHex(99000),   
            gasPrice: web3.utils.toHex(10e9),
            // 注意这里是代币合约地址    
            to: contractAddress,
            from: currentAccount,
            // 调用合约转账value这里留空
            value: '0x00',         
            // data的组成,由:0x + 要调用的合约方法的function signature + 要传递的方法参数,每个参数都为64位(对transfer来说,第一个是接收人的地址去掉0x,第二个是代币数量的16进制表示,去掉前面0x,然后补齐为64位)
            data: '0x' + 'a9059cbb' + addPreZero('3b11f5CAB8362807273e1680890A802c5F1B15a8') + addPreZero(web3.utils.toHex(1000000000000000000).substr(2))
        }
    
        var tx = new Tx(txData);
    
        const privateKey = new Buffer('your account privateKey', 'hex'); 
    
        tx.sign(privateKey);
    
        var serializedTx = tx.serialize().toString('hex');
    
        web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
            if (!err) {
                console.log(hash);
            } else {
                console.error(err);
            }
        });

    转载自:https://blog.csdn.net/ffzhihua/article/details/81126932

    展开全文
  • web3.js与智能合约交互

    千次阅读 2018-07-17 11:43:23
    为了让Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3对象。底层实现上,它通过RPC 调用与本地节点通信。web3.js可以与任何暴露了RPC接口的以太坊节点连接。 Web3源码下载地址 ...

    这是我本人在工作当中总结的,希望能给搞区块链的工程师有一些帮助

    为了让Ðapp运行上以太坊,一种选择是使用web3.js library提供的web3对象。底层实现上,它通过RPC 调用与本地节点通信。web3.js可以与任何暴露了RPC接口的以太坊节点连接。

    Web3源码下载地址 https://github.com/ethereum/web3.js

    web3中有eth对象web3.eth,具体来表示与以太坊区块链之间的交互。shh对象 web3.shh表示Whisper协议的相关交互。

    其他方法的在线文档:https://web3js.readthedocs.io/en/1.0/

    下面简单介绍web3的核心方法,网上大多数用的都是nodejs编写的,我用的是nodejs的代码,但是实现均是用原生的代码,基本上脱离了nodejs。

    1、web3与本地智能合约交互。

    1.1首先引入核心JS

           <script type="text/javascript" src="js/web3.min.js"></script>

    <script type="text/javascript" src="js/bignumber.min.js" ></script>

    web3.min.js:是web3核心代码。

    bignumber.min.js :支持无限精度无限大数的类。

    1.2获取到核心的web3对象。

    if (typeof web3 !== 'undefined') {

    web3 = new Web3(web3.currentProvider);

    } else { 

    web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"));

    }

    HttpProvider -- * 获取对象的地址,本地的直接可以用127.0.0.1:8548。连接测试网下面会介绍

    用次方法可以创建web3的核心对象,其余的操作均是用这个对象操作的。

    主要的核心是web3.eth,可以通过调用其中的方法得到想要的信息。

    例如:获取账户余额。通过调用web3.eth.getBalance(address);就能获取制定用户的地址。

    1.3通过web3获取到发布的智能合约对象

    之前的操作仅仅是连接到了区块链,并没有和自己的智能合约进行交互。

    和自己发布的智能合约进行交互需要做一下准备。

    a.智能合约地址:智能合约所在区块链的地址。

    b.ABI字符串:值程序的接口,主要用于连接Dapp应用和区块链的连接

    1.3.1 智能合约地址

    合约地址可以从remix的右侧复制。

    发布在测试网的可以在跳转网页上看到智能合约的地址

    1.3.2ABI字符串

    ABI可以在remix未发布之前就可以看到

    复制好的ABI保存到JS中,以JSON字符串形式保存。

    1.3.3获取对象

    通过web3核心对象,加载智能合约对象

    tokenObject = web3.eth.contract(abi,default_account).at(contractAddr);

    abi -- * 以上复制的ABI JSON字符串。

    default_account -- 发布合约的账户地址。不是必须项目。

    contractAddr  --* 合约地址。

    方法调用成功返回智能合约对象,在就可以调用在智能合约中定义的方法。

    例如,智能合约中的name方法。

    直接可以调用方法,获取想要获得的信息。

    2、web3与以太坊测试网交互。

    以上介绍了怎么与本地连接,下面介绍怎么与测试网连接。

    2.1获取开放接口连接

    (注:获取接口的网站注册登录必须翻墙才能注册。)

    与测试网连接,需要与测试网的连接接口需要在网上注册,通过指定的网址访问测试链。

    注册地址:https://infura.io/register

    通过注册登录获取到连接的key

    连接的方式为

     Main Ethereum Network //主网连接

      https://mainnet.infura.io/  + key

     Test Ethereum Network (Ropsten) // Ropsten测试网连接

      https://ropsten.infura.io/  + key

     eg: 我的代码里连接以太坊测试网的代码示例

    只需要获取到核心的web3对象,其余的操作和本地的连接方式相同。

     

    展开全文
  • open-web3.js-源码

    2021-03-29 11:11:22
    此monorepo包含Open Web3 Stack提供的所有Javascript包。 套餐概述 Polkadot.js类型。 Polkadot.js派生用于ORML的库。 用于基于Substrate的链的node.js索引器服务器。 基于基质的链的监视库。 polkadot.js的...
  • web3.js与合约交互

    千次阅读 2018-07-13 17:36:15
    在我的以太坊手机轻钱包开发javascript签名合约交易这篇文章中我已经写到了如何用web3.js发布合约 接下来我们将使用web3.js与现有合约交互,下面合约也是以太坊....javascript签名合约交易这篇文章使用的合约案例....

      web3.js官方文档:https://web3js.readthedocs.io/en/v1.2.11/index.html

     

    web3.js开源文库(github):https://github.com/ethereum/web3.js

     

     在我的以太坊手机轻钱包开发javascript签名合约交易这篇文章中我已经写到了如何用web3.js发布合约

    接下来我们将使用web3.js与现有合约交互,下面合约也是以太坊....javascript签名合约交易这篇文章使用的合约案例.如果您目前没有部署下面合约,你可以参考这边文章部署好合约.,然后按步骤实操.

     

     

     

     

    示例合约

    本文以下面的MetaCoin合约为例,说明在应用中使用web3.js操作智能合约的方法。

     
    1. // 本文中用到的MetaCoin合约

    2. pragma solidity ^0.4.2;

    3.  
    4. contract MetaCoin {

    5. mapping (address => uint) balances;

    6.  
    7. event Transfer(address indexed _from, address indexed _to, uint256 _value);

    8.  
    9. function MetaCoin() {

    10. balances[msg.sender] = 10000;

    11. }

    12.  
    13. function sendCoin(address receiver, uint amount) returns(bool sufficient) {

    14. if (balances[msg.sender] < amount) return false;

    15. balances[msg.sender] -= amount;

    16. balances[receiver] += amount;

    17. Transfer(msg.sender, receiver, amount);

    18. return true;

    19. }

    20.  
    21. function getBalance(address addr) returns(uint) {

    22. return balances[addr];

    23. }

    24.  

     

    这个合约有三个函数:

    MetaCoin:构造函数,在合约被部署到区块链时执行 
    getBalance:返回某账户的余额,它只读数据,不会修改数据 
    sendCoin:向另一个账户发送指定数量的MetaCoin,它会改变状态变量balances 

    创建web3对象

    要使用web3.js与区块链交互,需要先创建web3对象,然后连接到以太坊节点

     

     

    1.     // 创建web3对象

    2. var web3 = new Web3();

    3. // 连接到以太坊节点

    4. web3.setProvider(new Web3.providers.HttpProvider("http://localhost:8545"));

     

     

     

    获取已部署的合约实例

     

    要使用智能合约,必须先从区块链中获取到合约实例,获取合约实例需要合约的ABI和合约的地址:

     
    1. // 合约ABI

    2. var abi = [{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"amount","type":"uint256"}],"name":"sendCoin","outputs":[{"name":"sufficient","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"}];

    3. // 合约地址

    4. var address = "0xb2cdd356e58280906ce53e1665697b50f88aac56";

    5. // 通过ABI和地址获取已部署的合约对象

    6. var metacoin = web3.eth.contract(abi).at(address);

     

    metacoin就是获取到的合约对象实例,此时metacoin对象中就包含了与合约函数同名的Javascript函数,之后就可以通过metacoin对象来调用合约中的函数了。

     

    调用合约函数

    MetaCoin合约中有两个函数:getBalance和sendCoin,可以通过metacoin对象直接调用这两个函数。

    首先来看getBalance,由于getBalance函数只是从区块链中读数据,而不修改数据,因此我们通过在getBalance后面加上.call()的方式调用:

     
    1. var account_one = web3.eth.accounts[0];

    2. var account_one_balance = metacoin.getBalance.call(account_one);

    3. console.log("account one balance: ", account_one_balance.toNumber());

    这里:

     

    在getBalance后加上.call()来显式指明用call的方式调用 
    通过call的方式调用可以得到getBalance函数的返回值 
    通过call的方式调用的函数只在节点本地虚拟机中执行,不会产生交易,不会花费费用,不会修改数据 
    下面来看sendCoin函数,由于sendCoin要修改合约内部的数据,所以要使sendCoin生效,必须要向区块链发送交易,可以在sendCoin后面加上.sendTransaction()来指明这是一笔交易:

     
    1. var account_one = web3.eth.accounts[0];

    2. var account_two = web3.eth.accounts[1];

    3. // 提交交易到区块链,会立即返回交易hash,但是交易要等到被矿工收录到区块中后才生效

    4. var txhash = metacoin.sendCoin.sendTransaction(account_two, 100, {from:account_one});

    这里:

     

    在sendCoin函数后加上.sendTransaction()指明要向区块链发送交易 
    合约代码中sendCoin函数只有两个参数,而在web3中通过.sendTransaction()调用合约函数的时候需要增加最后一个参数,它是一个javascript对象,里面可以指定from/value/gas等属性,上面的例子用from来指定交易的发送者 
    上面的调用语句执行后,会向区块链提交一笔交易,这笔交易的发送者是account_one,接收者是metacoin的地址,交易的作用是以account_two和100作为参数执行合约的sendCoin函数 
    函数会立即返回交易的hash,表明交易已经提交到区块链,但是并不知道交易何时处理完成,交易要等到被旷工收录到区块中后才会生效 
    监听合约事件

    当通过.sendTransaction()调用合约的时候,交易会被提交到区块链进行处理,这个处理需要一定的时间,如果需要等交易完成之后再执行其他操作,就必须要知道交易何时完成,那么如何知道交易何时完成呢?可以通过监听合约事件来实现。

    在合约中可以定义事件,事件可以带有参数,在合约函数内部完成某些操作时,可以触发事件,向外界传达一些信息。例如,在MetaCoin合约中定义了一个事件叫做Transfer,表示一个转账的事件,它带有三个参数:交易的发送者、接受者、转账数量。在sendCoin函数中,转账成功后就会触发Transfer事件,将对应的参数传给该事件,这样外部监听到事件后,可以取出事件的参数来获得交易发送者、接收者、数量。同时事件中还带有其他信息,比如交易hash等。

    在web3中使用事件,要首先获取事件对象,然后监听事件,如果事件发生,就会在回调函数中获取到事件信息:

     
    1. // 获取事件对象

    2. var myEvent = metacoin.Transfer();

    3. // 监听事件,监听到事件后会执行回调函数

    4. myEvent.watch(function(err, result) {

    5. if (!err) {

    6. console.log(result);

    7. } else {

    8. console.log(err);

    9. }

    10. myEvent.stopWatching();

    11. });

    12.  
    13. // 输出:

    14. { address: '0xb2cdd356e58280906ce53e1665697b50f88aac56',

    15. blockNumber: 651,

    16. transactionIndex: 0,

    17. transactionHash: '0xcc71bc2824cc84d1ee831c46189e3a80cf0af05697ba0370693aa97390c8067b',

    18. blockHash: '0x1d53f04206f3926d0f311b1230a9dd0b0c5aadac35b169a6a609e384ab130c6f',

    19. logIndex: 0,

    20. removed: false,

    21. event: 'Transfer',

    22. args:

    23. { _from: '0x68b73956d704007514e9257813bdc58cdf3c969a',

    24. _to: '0x9c3c1a2f5ef913fac44f0348a78f68d835f3f26e',

    25. _value: { [String: '100'] s: 1, e: 2, c: [Object] } } }

    1.  

    从输出可以看出,获取到的事件信息包括事件的参数、事件名、区块号、交易hash等。

     

    通过检测事件中的transactionHash与调用合约函数返回的交易hash是否一致,可以判定某一笔交易是否已完成:

     
    1. var account_one = web3.eth.accounts[0];

    2. var account_two = web3.eth.accounts[1];

    3.  
    4. var account_one_balance = metacoin.getBalance.call(account_one);

    5. console.log("account one balance:", account_one_balance.toNumber());

    6.  
    7. var txhash = metacoin.sendCoin.sendTransaction(account_two, 100, { from: account_one });

    8.  
    9. var myEvent = metacoin.Transfer();

    10. myEvent.watch(function (err, result) {

    11. if (!err) {

    12. if (result.transactionHash == txhash) {

    13. var account_one_balance = metacoin.getBalance.call(account_one);

    14. console.log("account one balance after sendCoin:", account_one_balance.toNumber());

    15. }

    16. } else {

    17. console.log(err);

    18. }

    19. myEvent.stopWatching();

    20. });

    21.  
    22. // 输出:

    23. account one balance: 7000

    24. account one balance after sendCoin: 6900

    展开全文
  • 使用Web3.js和Infura的智能合约 Web3.js是一个库的集合,这些库使您可以使用HTTP或IPC连接与本地或远程以太坊节点进行交互。 在本练习中,我们将使用web3.js在以太坊Ropsten测试网上部署合约并进行使用。 我们将首先...
  • 本教程用JavaScript语言调用Web3.js的API编写以太坊客户端,主要内容如下:web3.js安装与环境搭建、连接私有链、使用JavaScript发布智能合约、BigNumber、单位转换、十六进制与Ascii互转、字符串生成与hash编码、...
  • web3.js是以太坊提供的一个Javascript库,它封装了以太坊的JSON RPC API,提供了一系列与以太坊交互的Javascript对象和函数,通过它我们可以很方便的与以太坊和智能合约进行交互。在我之前的博客中,已经介绍了以太...
  • 以太坊:Web3.js 0.20 使用说明

    万次阅读 2019-05-09 09:14:13
    本文档是web3.js 0.20.x版本翻译,其对应的官方文档地址在JavaScript-API。 如果你使用的是 web3.js 1.0版本,其对应的官方文档地址在Web3js Readthedocs。 Web3是一套和以太坊节点进行通信的API,如果我们需要基于...
  • web3.js 1.0 官方文档中文版发布

    千次阅读 2018-05-17 20:06:46
    web3.js是以太坊的JavaScript接口库,目前最新版本是1.0.0 BETA的API官方文档由汇智网翻译、整理并发布。链接:web3.js 1.0.0 API 中文官方文档
  • 在vue中使用web3.js开发以太坊dapp

    千次阅读 热门讨论 2021-01-22 11:34:07
    web3.js 1.0中文手册 MetaMask官方文档 web3.js文件 链接:https://pan.baidu.com/s/1_mPT-ZcQ9GU_U1CVhBKpLA 提取码:cbey //在vue中安装web3 npm install web3 --save //在main.js引入 import Web3 from 'web3' ...
  • web3.js连接metaMask钱包转账

    千次阅读 2021-05-25 09:35:39
    web3JavaScript库能够与以太坊区块链交互。 它可以检索用户帐户,发送交易,与智能合约交互等。 这里分享下相关文档 1.web3.js中文文档https://learnblockchain.cn/docs/web3.js/getting-started.html 2....
  • web3.js是以太坊官方的Javascript API,可以帮助智能合约开发者使用HTTP或者IPC与本地的或者远程的以太坊节点交互。实际上就是web3.js是一个库集合,允许您使用HTTP或IPC连接与本地或远程以太它节点进行交互。为了...
  • Dapp初探之Web3.js入门

    千次阅读 2018-11-07 17:21:47
    2. 文本会介绍合约如何应用在前端及web3.js的常用api  引言 你肯定很好奇什么是web3.js?第一反应听起来就是个js库(好吧,确实是这样...),我的任务就是告诉你为什么Dapp需要用到这个库,以及这个库是怎么和...
  • 安装web3.js连接以太坊开发环境

    万次阅读 2018-05-12 21:21:14
    0. Web3.js提供了用于和geth通信的JavaScript API。内部使用JSON RPC协议与geth通信1. 安装 node.js2. 安装 npm install web3 如果安装失败 执行:npm install web3@^0.20.03. 更新npm:npm i npm to update4. ...
  • 在DApp中,前端UI是通过JavaScript代码与以太坊、智能合约交互的,这里记录一个简单的例子,使用web3.js获取以太坊区块1的信息,使用web3.js调用智能合约方法。
  • web3.js查询方法的调用方式汇总

    千次阅读 2018-07-28 21:17:50
    web3.js中的constant方法调用: (1)调用方式1 contractAddr.register.call(amount, {from: account}); constant方法不需要gas。【from参数可以省略】 (2)调用方式2 contractAddr.register.call(amount, {...
  • 博主在安装web3.js的时候,偶然间安装了不同版本的web3.js,API操作也不相同,虽然都能达到目标,但是到底区别在哪呢?网上查找半天并没有人专门总结一下这块,所以今天斗胆总结一下,也算是加深对web3.js的理解。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,183,357
精华内容 473,342
关键字:

Web3.js