NFT數藏商品系統開發技術詳情

aa111111發表於2023-02-28

常用API介紹

1. 簽名交易web3.eth.accounts.signTransaction()

web3.eth.accounts.signTransaction(tx, privateKey, [, callback]) => promise<object>

1

第一個引數為tx,即定義該交易的細則,在其中可以定義的交易細則有gas,to,value,gasPrice等引數,其中gas是必須要設定的引數(其餘用到的交易引數都是可選擇的),gas引數規定了該交易將要花費的gas費用,to引數則說明了這筆交易的接受者,而value引數則規定了這筆交易中轉移代幣的數量

第二個引數為privateKey,為發起交易人的私鑰,該交易將由該私鑰進行簽署


第三個引數為callback,該引數為一個可選引數,該回撥函式返回的第一個引數為一個錯誤物件,第二個引數為結果物件


該介面返回一個Promise物件,如果簽署交易成功,將會返回該交易的一些具體資訊,如messageHash,rawTransaction,transactionHash等資訊


2. 部署合約contractInstance.deploy()

new web3.eth.Contract(jsonInterface[, address][, options]) => promise<contract>

1

該方法用於生產合約例項,只有透過合約例項才能進行部署操作。該函式只需要填寫一個一個引數即可,jsonInterface即為該合約的abi,填入該引數即可完成合約例項的生成


contractInstace.deploy(options) => promise<transaction>

1

改方法用於部署合約,呼叫該函式將返回部署合約交易的具體資訊

其中的引數為options,其中裡面可以寫入兩個部分,即data(String)與arguments(Array)兩個引數,data引數為合約的bytecode;arguments引數為合約建構函式中的引數,因此該引數為可選的


deploy函式會返回一個交易物件,該物件自帶一個陣列與4個函式,陣列表示先前傳入的建構函式的入參,四個函式分別為send(),estimateGas(),encodeABI(),createAccessList()


3. 呼叫合約方法methods.myMethod.call()

myContract.methods.myMethod(param1[, param2[, ...]]).call(options [, defaultBlock] [, callback]) => returnValuesOfContract

1

該方法用於呼叫一個“constant”方法並在不發起任何交易的同時在EVM執行智慧合約的方法,使用此方法呼叫的智慧合約方法均不會改變合約狀態

其中myMethod()括號中填入的引數為該方法的入參,call()中填入的options包含如下幾個方面的值:from、gasPrice、gas,call()中還可以選擇性的填入defaultBlock與callback,其中defaultBlock為預設區塊設定,callback回撥函式第一個引數為錯誤物件,第二個引數為合約方法結果


該方法會返回撥用函式的返回結果,如果返回結果為多個,則返回一個帶有索引的物件


4. 訂閱監聽事件web3.eth.subscribe()

web3.eth.subscribe(type [, options] [, callback]) => subscriptionInstance

1

該方法用於訂閱監聽智慧合約中觸發的事件

其中訂閱方法包含四種方法,分別為:pendingTransactions,newBlockHeaders,syncing,logs


監聽事件一般採用newBlockHeaders模式,該模式訂閱監聽傳入的區塊頭,該特性可以作為計時器來檢查區塊鏈上的變化。callback引數與上述函式一樣,第一個引數為錯誤物件,第二個引數為結果物件


同時在該函式的返回內容中,有幾個回撥函式比較常見:on("connected"), on("data"), on("error"), on("changed"),


一旦訂閱成功連線則觸發on("connected"),該函式返回訂閱id;

當log有資料時觸發on("data");

當訂閱出錯時觸發on("error");

當有log被刪除出區塊鏈時觸發on("changed");

簡單介紹Ethers.js

Ethers.js與Web3.js一樣,都是以太坊標準JavaScript API庫,Ethers.js最初是為了ethers.io設計,後來擴充為一個開放的JS API庫,與Web3.js相同的是,Ethers.js同樣可以與Moonbeam進行正常互動,這得益於Moonbeam是一個完全相容以太坊EVM的智慧合約平臺;而與Web3.js不同的是,Ethers.js在使用時不需要過多的回撥函式,而且可以搭配Hardhat工具是的語法得到進一步的最佳化


Ethers.js(Hardhat)的安裝與常用API介紹

Ethers.js(Hardhat)的安裝

Ethers.js的安裝分為兩種,一種為直接使用命令列安裝,另一種為透過Hardhat間接安裝(配合Hardhat使用),推薦第二種透過Hardhat?的方式使用Ethers.js(安裝Hardhat時透過hardhat-ethers外掛安裝經過包裝後的Ethers.js)


安裝步驟如下:


// command line

npm install --save ethers


// install Hardhat

npm init

npm install --save-dev hardhat

npx hardhat

1

2

3

4

5

6

7

常用API介紹

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(

        '

        {

            chainId: 1287,

            name: 'moonbase-alpha'

        }

);

1

2

3

4

5

6

7

8

在上面的程式碼示例中,透過JsonRpcProvider的方式,連線到了Moonbase Alpha測試網中,在其中不止可以定義url引數,還可以定義該網路的chainId與name等資訊


2. 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();

1

2

3

4

5

6

7

8

9

在上面的程式碼示例中,使用Wallet定義了alice與bob兩個Signer,接下來alice呼叫方法sendTransaction()方法向bob發起交易,轉移了1 ether的token


3. Contract Interaction

部署合約與生成合約例項離不開下面介紹的兩個方法:ContractFactory()與Contract,具體方法直接看下面的程式碼示例介面


// deploy contract

new ethers.ContractFactory(interface, bytecode[, signer])

contractFactory.deploy(..args)

contract.deployed()


// generate contract instance

new ethers.Contract(address, abi, signerOrProvider)

1

2

3

4

5

6

7

其中ContracFactory中的interface引數代表合約的abi

使用Hardhat編譯過後的合約,其abi與bytecode等編譯資訊都存放在了專案根目錄下的artifacts/contracts/CONTRACT_NAME.json檔案中


4. Utilities

utilities下提供的各種方法更像是各種各樣的工具,比較常用的有對BigNumber的操作,以太坊Token單位的直接轉換以及將string於bytes32相互轉化的工具等,以下列出幾個常見方法


// BigNumber

BigNumber.toNumber() => number

BigNumber.toHexString() => string<DataHexString>


// Display Logic and Input

ethers.utils.parseEther(string) => BigNumber

ethers.utils.formatEther(value(BigNumber)) => string


// Strings

ethers.utils.parseBytes32String(aBytesLike) => string

ethers.utils.formatBytes32String(text) => string<DataHexString<32>>

1

2

3

4

5

6

7

8

9

10

11

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字串表示形式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010128/viewspace-2937293/,如需轉載,請註明出處,否則將追究法律責任。

相關文章