• web3.js 交互 geth 实现转账余额查询功能


    区块链学习笔记-记录拉跨的学习之旅

    目的:使用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.总结

    现阶段碰到的问题 以及未解决的问题 可能有错误的地方 (总结个毛 拉跨就完事)

  • 相关阅读:
    Force.com微信开发系列(二)用户消息处理
    Force.com微信开发系列(一) 后台配置
    【Android开发】之Fragment与Acitvity通信
    【Android开发】之Fragment重要函数讲解
    【Android开发】之Fragment生命周期
    【Android开发】之Fragment开发1
    【Android开发】之MediaPlayer的错误分析
    【Andorid开发框架学习】之Mina开发之服务器开发
    【Andorid开发框架学习】之Mina开发之客户端开发
    【Andorid开发框架学习】之Mina开发之Mina简介
  • 原文地址:https://www.cnblogs.com/hmbb/p/15013242.html
Copyright © 2020-2023  润新知