目的:使用web3.js部署,調用智能合約 交互geth實現代幣轉帳和餘額查詢 (web.js 版本爲1.4.2)web
1.開啓私鏈 (--rpc 開啓rpc鏈接方式 默認監聽爲本地127.0.0.1:8545 經過--rpcaddr 可設置爲0.0.0.0 使其餘客戶端可以鏈接 這裏使用--dev 開發者模式 減去帳戶解鎖以及挖礦過程)數組
2.編寫智能合約代碼(實現轉帳 餘額查詢功能)app
// 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 編譯)ide
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)
}) ui
6.運行spa
7.總結code
現階段碰到的問題 以及未解決的問題 可能有錯誤的地方 (總結個毛 拉跨就完事)