web3.js 互動 geth 實現轉賬餘額查詢功能

海綿寶寶沒有派大星發表於2021-07-14

區塊鏈學習筆記-記錄拉跨的學習之旅

目的:使用web3.js部署,呼叫智慧合約 互動geth實現代幣轉賬和餘額查詢 (web.js 版本為1.4.2)

 

1.開啟私鏈 (--rpc 開啟rpc連線方式 預設監聽為本地127.0.0.1:8545 通過--rpcaddr 可設定為0.0.0.0 使其他客戶端能夠連線 這裡使用--dev 開發者模式 減去賬戶解鎖以及挖礦過程)

 

 

2.編寫智慧合約程式碼(實現轉賬 餘額查詢功能)

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract chishi{    
    
    mapping(address=>uint) public balanceof;
    function getBalance(address addr) view public returns(uint){
        
        return addr.balance;
    }
    function sends(address to) public payable{
    
        payable(to).transfer(1 ether);
        
    }

    
    fallback() external payable {}
    
    receive() external payable {}
}

 

 

3.編譯原始碼獲取ABI以及BYTECODE (這裡可以使用solc 進行編譯 這裡我直接用remix 編譯)

 

 

 

4.利用web3.js 進行合約部署 (這裡提出疑問 為什麼部署的合約的地址沒法直接賦值給變數 難道只能先部署 記下地址 然後在操作嗎? 感覺有點拉跨)

 

新版的web3.js 已經不推薦使用httpProvieds 這種連線方式了 因為它不支援訂閱 另外這裡的from 在remix編譯裡 是web3.eth.accounts[0] 新版的web3.js 不是這種獲取方式 而是  web3.eth.getAccounts() 但是這裡返回的不是陣列 我這不知道如何通過 陣列取值 拉跨

 

 

5.編寫js檔案 將所有操作 寫在其中 (最開始我是想實現外部賬戶對外部賬戶的轉賬 但是發現soildity裡沒有相關的函式 只有一個transfer()方法 這個方法的賬戶傳送方已經指定為合約賬戶 也就是說外部到外部 需要 先外部到合約再合約到外部 我不知道為什麼沒有直接外部到外部 拉跨)


var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"))
var chishiContract = new web3.eth.Contract([{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceof","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sends","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}],'0x3842529CfDc3Cb2b8e2d1E1B267ed62C2Acd00d9');
web3.eth.sendTransaction({from:'0xc6a950f25a9f5e2a72cd9d279e642d0e31035feb',to:'0x3842529CfDc3Cb2b8e2d1E1B267ed62C2Acd00d9',value:10000000000000000000})
to = '0xba160796014b367e0fd6bc0e3b188ec63a7ce19b'
console.log("初始餘額:")
chishiContract.methods.getBalance(to).call(console.log)
chishiContract.methods.sends(to).send({from:'0xc6a950f25a9f5e2a72cd9d279e642d0e31035feb'},function(err,transactionHash){
if(err)
console.log("傳送失敗")
else
console.log("現有餘額:")
chishiContract.methods.getBalance(to).call(console.log)
}) 

 

 

6.執行

 

 

7.總結

現階段碰到的問題 以及未解決的問題 可能有錯誤的地方 (總結個毛 拉跨就完事)

 

相關文章