Metamask 是一個瀏覽器插件,通過將用戶的私鑰存儲在瀏覽器的數據存儲中並使用密碼加密的種子短語來管理用戶的 PolySmartChain 錢包。 它是一個非託管錢包,這意味著用戶對其私鑰擁有完全的訪問權和責任。 一旦丟失,用戶將無法再控制儲蓄或恢復對錢包的訪問。
類型:非託管/高清
私鑰存儲:用戶本地瀏覽器存儲
與以太坊賬本的通信:Infura
私鑰編碼:助記符
1. 設置Web3
步驟1
在你的 DApp 中安裝以下內容:
npm install --save web3
創建一個新文件,將其命名為 web3.js 並在其中插入以下代碼:
//import Web3 from 'web3';
const getWeb3 = () => new Promise((resolve) => {
window.addEventListener('load', () => {
let currentWeb3;
if (window.ethereum) {
currentWeb3 = new Web3(window.ethereum);
try {
// Request account access if needed
window.ethereum.enable();
// Acccounts now exposed
resolve(currentWeb3);
} catch (error) {
// User denied account access...
alert('Please allow access for the app to work');
}
} else if (window.web3) {
window.web3 = new Web3(web3.currentProvider);
// Acccounts always exposed
resolve(currentWeb3);
} else {
console.log('Non-Ethereum browser detected. You should consider trying MetaMask!');
}
});
});
export default getWeb3;
上面的文件導出了一個名為 getWeb3() 的函數——其目的是通過檢測由 Metamask 注入的全局對象(以太坊或 web3)來請求 metamask 帳戶的訪問權限。
MetaMask 將一個全局 API 注入到其用戶在 window.ethereum 訪問的網站中(由於遺留原因,也可在 window.web3.currentProvider 獲得)。 該 API 允許網站請求用戶登錄,從用戶連接的區塊鏈加載數據,並建議用戶簽署消息和交易。 您可以使用此 API 來檢測 web3 瀏覽器的用戶。 簡單來說,這基本上意味著,在瀏覽器中安裝了 Metamask 的擴展/附加組件,您將定義一個名為 ethereum(舊版本為 web3)的全局變量——使用這個變量我們實例化我們的 web3 對象。
第2步
現在,在您的客戶端代碼中,導入上述文件,
import getWeb3 from '/path/to/web3';
並調用函數:
getWeb3()
.then((result) => {
this.web3 = result;// we instantiate our contract next
});
2. 設置帳戶
現在要發送交易(特別是那些改變區塊鏈狀態的交易),我們需要一個帳戶來簽署這些交易 我們從上面創建的 web3 對象實例化我們的合約實例:
this.web3.eth.getAccounts()
.then((accounts) => {
this.account = accounts[0];
})
getAccounts() 函數返回用戶元掩碼上所有帳戶的數組,accounts[0] 是用戶當前選擇的帳戶。
3. 實例化你的合約
一旦我們的 web3 對象就位,接下來我們將實例化我們的合約 > 假設您的合約 ABI 和地址已經就位:)
/ const myContractInstance = new this.web3.eth.Contract(myContractAbi, myContractAddress)
4.調用函數
現在,對於您想從合約中調用的任何函數,我們直接與實例化的合約對象(即步驟 2 中聲明的 myContractInstance)進行交互
快速回顧:- 改變合約狀態的函數稱為 send() 函數 - 不改變合約狀態的函數稱為 call() 函數 調用 call() 函數
this.myContractInstance.methods.myMethod(myParams)
.call()
.then (
// do stuff with returned values
)
調用 send() 函數
this.myContractInstance.methods.myMethod(myParams)
.send({
from: this.account,gasPrice: 0
})
.then (
(receipt) => {
// returns a transaction receipt}
)