Web1.0

生产信息的是一些浏览器的企业运营商,已一种用户只读的方式来传播信息。

但是人们渐渐不满足只看网站推送给自己的信息,有了表达的欲望

web2.0

网上信息生产者的主体:不仅仅是大型公司,普通用户也能够发布文章和评论,并且可以仔不同的网站上创建用户,从而增加参与度

还提供了一些web的应用程序,wordPress字写自发布平台

但是:由于信息就是资产已经是业内共识,但是作为信息创造者的普通用户却没有资产的所有权,通过这些数字资产产生的巨额利润都被实际拥有数据的互联网平台瓜分了

Web3.0

新的Web交互方式:从原来的“点-中心化服务器-点” 的数据传输,到“点–点”数据传输,摆脱中心化服务器的过渡方式,提高数据的隐秘性,传输的高效性,把数据所有权真正归还用户

简单来说:web3.0要做的就是“在可读可写”的基础上,进一步实现“可拥有”

web3.js && ethers.js

Web3.js与Ethers.js都属于以太坊标准JavaScript API库,二者各有特点,同样被广大的Web3开发者接受

Web3.js属于比较老牌的API库,功能比较强大,但是使用过程中需要注意各种回调函数;而Ethers.js属于新兴起的API库,其最大的特点在于其接口调用简单方便,对于不是很熟悉JS的开发者来说比较友好。

web3.js

  • web3.js 通过RPC调用与本地节点通信,它可以用于任何暴露了RPC层的以太坊节点
  • web3 包含 eth 对象 – web3.eth(专门与以太坊区块链交互)和 shh 对象 – web3.shh(用于与 Whisper 交互)
  • 以太坊作为一个区块链系统,一次请求具有不同的结束阶段。为了满足这样的要求,1.0.0 版本将这类函数调用的返回值包成一个“承诺事件”(promiEvent),这是一个 promise 和EventEmitter 的结合体。
    PromiEvent 的用法就像 promise 一样,另外还加入了.on,.once 和.off方法

常用 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
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: "0xc6888fa1000000000000000000000000000000000000000000000000000 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.contractvar MyContract = web3.eth.contract(abiArray);// 通过地址初始化合约实例var contractInstance = MyContract.at(address);// 或者部署一个新合约var contractInstance = MyContract.new([constructorParam1][, constructorParam2], {data: '0x12345...',from: myAccount,gas: 1000000});

调用合约函数

可以通过已创建的合约实例,直接调用合约函数

// 直接调用,自动按函数类型决定用 sendTransaction 还是 callmyContractInstance.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);});

Ethers.js

Ethers.js库中的API主要由4大部分组成:Providers,Signers,Contract Interaction,Utilities

  1. Provider

Provider是以太坊网络连接的抽象,其为标准以太坊节点功能提供简洁、一致的接口

在Provider中比较常用的方法为JsonRpcProvider,该方法允许通过JSON-RPC的方式连接某一个节点网络

// new ethers.providers.JsonRpcProvider([urlOrConnectionInfo[, networkish]])const provider = new ethers.providers.JsonRpcProvider(        'https://rpc.api.moonbase.moonbeam.network',        {            chainId: 1287,            name: 'moonbase-alpha'        });

在上面的代码示例中,通过JsonRpcProvider的方式,连接到了Moonbase Alpha测试网中,在其中不止可以定义url参数,还可以定义该网络的chainId与name等信息

  1. Signers

Signer是以太坊账户的抽象,可用于对消息和交易进行签名,并将签名过的交易发送到以太坊网络以执行状态更改操作

在Signer中比较常用的方法为Wallet,只有Wallet可以使用私钥对交易和信息进行签名

// new ethers.Wallet(privateKey[, provider])const alice = new ethers.Wallet(privateKeyAlice, provider);const bob = new ethers.Wallet(privateKeyBob, provider);const txReceipt = await alice.sendTransaction({    to: bob.address,    value: ethers.utils.parseEther('1.0')});await txReceipt.wait();

在上面的代码示例中,使用Wallet定义了alice与bob两个Signer,接下来alice调用方法sendTransaction()方法向bob发起交易,转移了1 ether的token

  1. Contract Interaction

部署合约与生成合约实例离不开下面介绍的两个方法:ContractFactory()与Contract,具体方法直接看下面的代码示例接口

// deploy contractnew ethers.ContractFactory(interface, bytecode[, signer])contractFactory.deploy(..args)contract.deployed()// generate contract instancenew ethers.Contract(address, abi, signerOrProvider)

其中ContracFactory中的interface参数代表合约的abi
使用Hardhat编译过后的合约,其abi与bytecode等编译信息都存放在了项目根目录下的artifacts/contracts/CONTRACT_NAME.json文件中

  1. Utilities

utilities下提供的各种方法更像是各种各样的工具,比较常用的有对BigNumber的操作,以太坊Token单位的直接转换以及将string于bytes32相互转化的工具等,以下列出几个常见方法

// BigNumberBigNumber.toNumber() => numberBigNumber.toHexString() => string<DataHexString>// Display Logic and Inputethers.utils.parseEther(string) => BigNumberethers.utils.formatEther(value(BigNumber)) => string// Stringsethers.utils.parseBytes32String(aBytesLike) => stringethers.utils.formatBytes32String(text) => string<DataHexString<32>>

BigNumber.toNumber():将BigNumber的值转换为JavaScript值

BigNumber.toHexString():将BigNumber值转换为0x开头,16进制的值

ethers.utils.parseEther(string):将一个整数转换为以ether为单位的大整数

ethers.utils.formatEther(value(BigNumber)):将大整数转换为以ether为单位的整数

ethers.utils.parseBytes32String(aBytesLike):返回一个bytes 32编码数据表示的解码字符串

ethers.utils.formatBytes32String(text):返回文本的bytes 32字符串表示形式

Moonbeam

Moonbeam平台使用集成的跨链信息传递,允许开发者创建访问多个远程区块链服务的智能合约。通过此方式结合Moonbeam的开发者友好型EVM平台、各类工支持和Substrate架构,为构建互连应用程序提供理想化的开发环境。 作者:Moonbeam社区 https://www.bilibili.com/read/cv18976490 出处:bilibili