从实战开始了解Web3(三)

584 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

前期回顾

# 从实战开始了解Web3(二) 这篇文章,咱们已经成功创建出来合约,并获取到代币余额,那么这篇文章,咱们还是围绕着上篇文章中所创建的代币合约为基点,开始了解更多api接口

正文开始

转账操作

既然咱们可以获取代币余额了,那获取到余额要做啥,肯定离不开转账,跟获取余额一样,转账也是有两种方式

  • 代币合约转账
//     这里需要注意一下,不知道有没有人还记得 咱们在获取代币余额的时候 获取出来的数值并不是咱们直接呈现给用户得到数值 咱们需要做一下精度转换,在这里 咱们进行转账同样如此,咱们需要将用户输入的数值,进行精度转换  转换为合约所需的精度

//金额 = web3.utils.toWei('用户输入的数值', "ether // 精度 ")

//这里来了点小区别  fromWei  和 toWei  一个是转换为用户可直接阅读的 一个是转换为合约可阅读的

contract.methods.transfer("接收地址", "金额").send(
  {
    gas: 600000, //见文章末讲解
    gaslimit: 10, //见文章末讲解
    from: "用户链接钱包",
    value: 0, //暂时忽略 后期会讲
  },
  function (err, hash) {
    //err  报错
    // hash 交易hash
  }
);
  • 主链币转账

同样代币合约能转账,主链币同样可以!

// 这里转账同样需要处理一下
//金额 = web3.utils.toWei('用户输入的数值', "ether // 精度 ")
web3.eth.sendTransaction(
  {
    from: "用户链接钱包",
    value: "金额",
    to: "接收地址",
    gas: 600000, //见文章末讲解
    gaslimit: 10, //见文章末讲解
  },
  function (err, hash) {
   //err  报错
   // hash 交易hash
  }
);


  • NFT 转账
contract.methods.transferFrom('用户链接钱包(从)', '目标地址(到)', 'NFT卡片的id').send(
  {
    gas: 600000, //见文章末讲解
    gaslimit: 10, //见文章末讲解
    from: "用户链接钱包",
  },
  (err, hash) => {
    if (err) {
      reject(false);
    } else {
      resolve(hash);
    }
  }
);

扩展知识点

  • 什么是gas?

    gas是“燃料”的意思。在以太坊区块链上实现了一个EVM(以太坊虚拟机)的代码运行环境,在链上执行写入操作时,网络中的每个全节点都会进行相同的计算并存储相同的值。 这种执行的消耗是昂贵的,为了促使大家将能在链下进行的运算都不放到链上进行,也为了奖励矿工,在链上每执行一个写入操作时,都需要支付一定的费用,用gas为单位来计数。 每个在链上可以执行的命令都设置了一个消耗的gas值,例:PUSH操作需要消耗3个gas,一次转账一般要消耗21000 gas,gas使用ether来支付。 1 ether = 1 x 10^18 wei = 1 x 10^9 Gwei 。

  • 什么是gasLimit?

    Gas Limit就是一次交易中gas的可用上限,也就是你的交易中最多会执行多少步运算。 由于交易复杂程度各有不同, 确切的Gas消耗量是在完成交易后才会知道,因此在你提交交易之前,需要为交易设定一个Gas用量的上限。 每个区块有gas limit,即单个区块允许的最多gas总量,可以用来决定单个区块中能打包多少笔交易。 我们每一次交易或合约调用都要设置一个gas limit,如果该次操作所使用的gas数量小于或等于您所设置的gas limit,则会被执行。但如果gas总消耗量超过gas limit,所有的操作都会被重置,但费用依旧会被收取——因为要奖励已经付出劳动的矿工。 在执行中实际消耗的gas值总和叫gas used,gas used未达到gas Limit, 那么只会按实际gas used 收取交易服务费,没有使用完的gas会退还到原账号。根据我查找的资料来看,这里所说的gas Limit就是指chapter 3中的gas属性。 如果您尝试将一个会使用超过当前区块gas limit的交易打包,则会被网络拒绝,会反馈below gas limit。

send()

上一期咱们讲过call(),在web3中 call()是调用合约的方法,也就是查询所需要使用的,如果咱们需要将数据发送给合约那便需要使用 send()方法

contract.methods.xxxxx([param1[, param2[, ...]]]).send(options[, callback])

参数:

  • options - Object: 选项,包含如下字段:

    • from - String: 交易发送方地址
    • gasPrice - String : 可选,用于本次交易的gas价格,单位:wei
    • gas - Number : 可选,本次交易的gas用量上限,即gas limit
    • value - Number|String|BN|BigNumber: 可选,交易转账金额,单位:wei
  • callback - Function: 可选的回调参数,其参数为交易哈希值和错误对象

历史文章

# 从实战开始了解Web3(一)

# 从实战开始了解Web3(二)