交易 當然也是 去中心化應用 極為重要的一環
那要如何執行交易呢?
如果一個程序能直接控制資產不是很恐怖嗎?
要是金額瞬間被轉走怎麼辦呢?
因此我們要透過 錢包(MetaMask)
程序本身只是提供建議交易 再由使用者同意
最後的同意權 仍舊落在使用者身上
這篇將以下重點進行敘述:
另外可參考 GitHub 專案位置:
https://github.com/weiawesome/dapp_website
寫下本頁面的目標
要傳送給的帳戶地址與金額
執行交易的按鈕
顯示該筆交易資訊
顯示該筆交易所在的區塊的區塊資訊
├── src
│ ├── app
│ ├── pages
│ │ ├── build_transaction.tsx
│ ├── style
│ │ ├── build_transaction.css
│
"src/app/pages/build_transaction.tsx" 邏輯與基本布局
"src/app/style/build_transaction.css" 對上述畫面的修飾
因此 最後畫面會顯示在 /build_transaction 這個路由下
// 交易結果物件
class Receipt{
// 交易哈希
TransactionHash:string;
// 交易發起人
From:string;
// 交易接收人
To:string | null;
// 交易所在的區塊 的 區塊哈希
BlockHash:string;
// 交易所在的區塊 的 區塊高度
BlockHeight:number| null
}
// 建立並執行交易 透過 web3.js
const BuildTransactionWeb3=async () => {
try {
if (!window.ethereum || !window.ethereum.isConnected()) {
throw new Error('請安裝 MetaMask 並連接到一個 Ethereum 網路');
}
const provider = window.ethereum;
const web3 = new Web3(provider);
const toAddress = addrRef.current?.value;
const amountToSend = web3.utils.toWei(valueRef.current!.value, 'ether');
const accounts = await window.ethereum.request({method: 'eth_requestAccounts'});
const account = accounts[0];
const transactionObject = {
from: account.toString(),
to: toAddress,
value: amountToSend,
};
web3.eth.sendTransaction(transactionObject)
.on('transactionHash', hash => {
console.log('交易哈希:', hash);
})
.on('receipt', transactionReceipt => {
console.log('交易收據:', transactionReceipt);
let tmp = new Receipt();
tmp.BlockHeight = Number(transactionReceipt!.blockNumber);
tmp.BlockHash = transactionReceipt!.blockHash;
tmp.TransactionHash = transactionReceipt!.transactionHash;
tmp.From = transactionReceipt!.from;
tmp.To = transactionReceipt!.to;
setR(tmp);
})
.on('error', error => {
})
} catch (error) {
console.log(error);
}
}
// 建立並執行交易 透過 ethers.js
const BuildTransactionEthers=async () => {
try {
if (!window.ethereum || !window.ethereum.isConnected()) {
throw new Error('請安裝 MetaMask 並連接到一個 Ethereum 網路');
}
let provider = new ethers.BrowserProvider(window["ethereum"]);
const signer =await provider.getSigner();
const tx = {
to: addrRef.current!.value,
value: parseEther(valueRef.current!.value),
};
const transactionResponse = await signer.sendTransaction(tx);
console.log(transactionResponse);
const transactionReceipt = await transactionResponse.wait();
let tmp=new Receipt();
tmp.BlockHeight=transactionReceipt!.blockNumber;
tmp.BlockHash=transactionReceipt!.blockHash;
tmp.TransactionHash=transactionReceipt!.hash;
tmp.From=transactionReceipt!.from;
tmp.To=transactionReceipt!.to;
setR(tmp);
console.log(transactionReceipt);
} catch (error) {
console.error('提交交易時發生錯誤:', error);
}
}
由於 現實資金轉移 需要手續費
可是我沒有 Money~Money(嗚嗚嗚)
因此使用 Ganache 做為模擬 OKKKKK~~~
接下來 就把 第一個帳戶 轉金額給 第二個帳戶
藉由上方兩筆交易:
透過撰寫前端程序 並配合 MetaMask 完成交易
儘管完成了轉帳 但會發現很大程度需要使用者的互動
而無法完全自動化 這是為何呢?
在區塊鏈中 虛擬貨幣的轉移
尤其又與資產有關 因此對於控制性與安全性就非常重要
透過一定程度的與使用者互動 確保了它的安全性
當然 DApp(去中心化應用程序)
也是有許多功能會自動化 而無須手動授權
不過仍是要在 安全性 與 便利性 中取得平衡
希望透過這篇能理解
現在透過程序還能轉帳了呢!!!
很有趣吧! 感覺好像很有樣子對嗎?
不過知道 去中心化應用程序(DApp) 的起源嗎?
早在 比特幣 出現時 就有類似的概念了
不過直到 "智能合約" 的出現
讓人發現 去中心化應用程序(DApp) 不必再侷限於單純的資金轉移
更多的想法與應用也隨之而生!!!