【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能

审核看清楚了 ! 这是以太坊测试网络!用于学习的测试网络!!! 有关web3 和区块链的内容为什么要给我审核不通过? 别人凭什么可以发!

目标成果:

实现功能分析:

  1. 显示账户信息,地址、chainID、网络ID、余额
  2. 实现转账功能

需要准备的事情:

  1. 一个有sepolia ETH余额的web3账户,没有可以找水龙头领取或者某鱼购买
  2. 浏览器插件安装了 MetaMask钱包插件(小狐狸钱包)
  3. 准备一个web容器,我这边使用的是nginx

操作环节:

先写出网页大概的内容布局;

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>js连接web3钱包</title>
  </head>
  <body>
    <div>
      <div><h3>详情信息</h3></div>

      <div>
          <div>
            <label>账户地址:<span></span></label>
          </div>
          <div>
            <label>ChainID:<span></span></label>
          </div>
          <div>
            <label>网络ID:<span></span></label>
          </div>
          <div>
            <label>余额:<span></span></label>
          </div>
      </div>

      <div>
        <button>转账</button>
      </div>
    </div>


    <div>
      <label>对手地址<input type="text"></label>
      <br>
      <label>ETH数量<input type="text"></label>
      <br>
      <button>确定</button>
      <button>取消</button>
    </div>



  </body>
</html>

接下来是写js部分

把大概的框架都写出来:

//判断浏览器是否具备MetaMask环境
      const initialize = async ()=>{
   
        if(!isMetaMaskInstalled()){
   
          //如果没安装弹出窗口
          alert("请先安装 MetaMask");
        }else{
   
          await getNetwork(); //获取网络
          await getChainId(); //获取链
          await getAccount(); //获取账户地址
          await getBalance(); //获取余额
        }
      }

在上面这个initialize()方法中,里面我们调用了5个方法,每个方法都有其各自的作用.

方法 作用
isMetaMaskInstalled() 用来判断浏览器是否安装了MetaMask钱包
getNetwork() 获取网络号
getChainId() 获取链ID
getAccount() 获取账户地址
getBalance() 获取账户余额

现在开始着手写这几个方法

  • 判断是否安装
      const isMetaMaskInstalled = () => {
        const { ethereum } = window;
        return Boolean(ethereum && ethereum.isMetaMask);
      }
  • 获取网络号然然后渲染到html页面上

html部分要要加上 对应的id进行innerHTML

<div>
            <label>账户地址:<span id="accountSpan"></span></label>
          </div>
          <div>
            <label>ChainID:<span id="ChainIdSpan"></span></label>
          </div>
          <div>
            <label>网络ID:<span id="NetworkSpan"></span></label>
          </div>
          <div>
            <label>余额:<span id="BalanceSpan"></span></label>
          </div>

js部分

 const getNetwork = async () => {
        try {
          const networkId = await ethereum.request({ method: 'net_version' });
          NetworkSpan.innerHTML = networkId;
        } catch (error) {
          console.error(error);
        }
      }

      const getChainId = async () => {
        try {
          const chainId = await ethereum.request({ method: 'eth_chainId' });
          ChainIdSpan.innerHTML = chainId;
        } catch (error) {
          console.error(error);
        }
      }


      const getAccount = async () => {
        try {
          const accounts = await ethereum.request({ method: 'eth_requestAccounts' });//调用这个方法会弹出MetaMask的一个授权窗口
          accountSpan.innerHTML = accounts[0]; // 显示连接第一个账户
        } catch (error) {
          console.error(error);
        }
      }

      const getBalance = async () => {
        const accounts = await ethereum.request({ method: 'eth_requestAccounts' });
        const balance = await ethereum.request({
          method: 'eth_getBalance',
          params: [accounts[0], 'latest']
        });
        userBalance = parseInt(balance, 16);
        const ethBalance = Web3.utils.fromWei(balance, 'ether');//这里要引入一个web3.js文件
        BalanceSpan.innerHTML = `${ethBalance} ETH`;
      }
      
      window.addEventListener('DOMContentLoaded', initialize);//进入网页后自动调用initialize方法,不调用就无法查询和渲染页面

还要引入一个web3.js用于单位转换(其实我们也可以自己计算)

    <script src="https://cdn.jsdelivr.net/npm/web3@1.6.0/dist/web3.min.js"></script>

现在已经完成显示账户信息的功能了!

接下来我们要实现我们的转账功能.,代码如下(还没有美化的版本)

     <!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>js连接web3钱包</title>
    <style>
      #transferModal {
     
        display: none;
        position: fixed;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
        background-color: white;
        padding: 20px;
        box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
      }
    </style>
  </head>
  <body>
    <div>
      <div><h3>详情信息</h3></div>
      <div>
        <div>
          <label>账户地址:<span id="accountSpan"></span></label>
        </div>
        <div>
          <label>ChainID:<span id="ChainIdSpan"></span></label>
        </div>
        <div>
          <label>网络ID:<span id="NetworkSpan"></span></label>
        </div>
        <div>
          <label>余额:<span id="BalanceSpan"></span></label>
        </div>
      </div>
      <div>
        <button id="sendButton">转账</button>
      </div>
    </div>

    <div id="transferModal">
      <label>对手地址<input type="text" id="recipientAddress"></label>
      <br>
      <label>ETH数量<input type="text" id="ethAmount" required min="0" step="0.0001"></label>
      <br>
      <button id="confirmTransferButton" type="submit">确定</button>
      <button id="cancelTransferButton">取消</button>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/web3@1.6.0/dist/web3.min.js"></script>
    <script>
从您的描述来看,您正在尝试在Stata软件中运行ADF检验(Augmented Dickey-Fuller test),用于检测时间序列数据的平稳性。但是出现了错误信息:“**time variable not set, use tsset varname ... r(111);**”。这表明,在执行`dfuller`命令之前,需要先设置时间变量。 以下是详细的解释: --- ### 错误原因分析 在Stata中,许多针对时间序列的操作都需要明确指定时间变量。如果未通过`tsset`命令声明时间变量,则会报错“time variable not set”。 例如,以下是一段可能出现该问题的代码片段: ```stata foreach var of varlist 电价 用电量 天然气价格 天然气产量 天然气消费量 GDP 工业增加值 平均气温 { dfuller `var', trend regress lags(2) } ``` 上述循环会对列表中的每个变量依次执行ADF单位根检验 (`dfuller`) ,但如果事先没有对数据集的时间维度进行定义,就会触发此错误。 --- ### 解决方案 #### 步骤 1:确认是否有适当的时间变量 首先检查您的数据集中是否存在可以作为时间索引使用的变量,比如年份、月份或其他表示时间顺序的字段。如果没有这样的变量,则需补充添加。 假设存在名为`t` 的时间变量,并且它是按年度排列的数据点;或者是更高频率如季度(`q`) 或月度(`m`) 等形式记录的信息。 #### 步骤 2:使用 tsset 设置时间序列属性 根据实际情况设定对应的时间格式并应用到当前工作文件里所有观察值上。语法结构如下所示: 对于仅有单一日期列的情况: ```stata gen year = substr(t,1,4) if length(t)==6 //假如t形似"yyyyMM" destring year , replace force format %ty year tsset t ``` 如果是包含面板特征的数据集还需要额外提供个体标识符ID : ```stata tsset id_var time_var ``` 其中id_var代表截面单元编号而time_var则指代实际观测时刻标签. 完成以上操作之后再重新执行原脚本应该就不会遇到同样的麻烦了。 --- ### 示例修正后的完整流程 基于前面提到的内容调整好的版本可能是这样样子滴👇: ```stata * Step A - Define Time Series Structure First! tsset 时间变量名 * Then run loop as planned. foreach var of varlist 电价 用电量 天然气价格 天然气产量 天然气消费量 GDP 工业增加值 平均气温{ display "Processing Variable : `var'" quietly dfuller `var', trend regress lags(2) /* Optional Part Below */ estimates store adf_`var' di "" } estimates table _all, stats(N ll) ``` 这里增加了quietly关键字让程序自动跳过中间冗长的结果显示只保留最终统计摘要部分呈现给用户观看即可~ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值