当前位置:   article > 正文

Web3.js_ethereumjs-tx

ethereumjs-tx

1. 以太坊概念

以太坊是一个全新开放的区块链平台,它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用;它是一个开放源代码的项目,由全球范围内的很多人共同创建,允许用户按照自己的意愿创建复杂的操作;以太坊核心是以太坊虚拟机(“EVM”)/智能合约,可以执行任意代码,用计算机科学术语说,以太坊的虚拟机是“图灵完备的”。


自我理解: 以太坊有一个规范的计算机称为以太坊虚拟机,他的状态获得所有人的认可,每个参与进来的都会在自己的计算机中保存一份该计算机的状态,但是如果需要修改,那么就所有参与进来的电脑都修改,就达到了一致,不好篡改的特点

2. 什么是以太币

以太币简称ETH,ETH是一种加密货币。这是稀缺的数字货币,您可以在互联网上使用 - 网传是比特币2.0版本

以太币 (ETH) 是用于以太坊网络上许多事物的加密货币。 从根本上讲,它是唯一可接受的交易费用支付方式,


自我理解:以太币是一种虚拟数字货币,类似于现实中的人民币,也是可以自由交易的

以太币单位:

由于以太坊上许多交易规模较小,ETH有一些面额单位表示较小金额。 在这些单位中,Wei 与 Gwei 特别重要。

Wei是最小的ETH单位,因此在以太坊黄皮书等众多技术实施中,都以 Wei 为基础进行运算。

Gweigiga-wei 的缩写),常用于描述以太坊的 gas费用。

面额ETH值
Wei10-18
Gwei10-9

3. 以太币的优势

  1. 以太币让您成为自己的银行,你可以自由支配你自己的钱包
  2. 加密机制很强,保障您的资金安全
  3. 点对点交易,可以自由交易,不需要通过类似于银行的第三方平台
  4. 没有中心化,每个人都是主角
  5. 对所有人开放

4. 什么是智能合约?

实际上,参与者不会每当在 EVM 上请求计算时都编写新代码。 而是应用程序开发者将程序(可重复使用的代码片段)上传到 EVM存储中,然后用户通过不同的参数请求执行这些代码片段。 我们将这些上传至网络并由网络执行的程序称为智能合约。


自我理解:

  1. 可以把智能合约想象成一个规定,只要满足某个条件就执行某个脚本/代码,比如自助售货机,付款自动出货

5. 其它概念

5.1 EVM 以太坊虚拟机

以太坊虚拟机是一个全局虚拟计算机,以太坊网络每个参与者都会存储并同意其状态。 任何参与者都可以请求执行 EVM 上的任意代码;代码执行会改变 EVM 的状态。


自我理解:

​ 像一个大的调度仓,每个参与者都像这个看齐

5.2 帐户

存储 ETH 的地方。 用户可以初始化帐户,将 ETH存入帐户,并将 ETH给其他用户。 帐户和帐户余额储存在 EVM中的一个大表格中,它们是EVM总体状态的一部分。


自我理解:

​ 有点像自己的私人钱包,可以放钱的

5.3 交易

“交易请求”是在 EVM 上执行代码请求的正式术语。“交易”是指已完成的交易请求和相关的 EVM 状态变化。 任何用户都可以从节点向网络广播交易请求。 为了使交易请求影响 EVM 的一致状态,就必须由其他节点对其进行验证、执行和“提交到网络”。 执行任何代码都会导致 EVM 的状态更改;一旦提交后,该状态更改将广播到网络中的所有节点。 以下为一些交易示例:

  • 从我的帐户发送 X 个 ETH 到 Alice 的帐户。
  • 将一些智能合约代码发布到 EVM 内存中。
  • 使用 Y 参数执行 EVM 中 X 地址的智能合约代码。

自我理解:

​ 这里的交易不止是一个简单的金币交易,更像是一个请求,可以用来发送ETH交易,或者发布合约,调用合约方法等等…

5.4 GAS 和费用

Gas 是指在以太坊网络上执行特定操作所需的计算工作量。

由于每笔以太坊交易都需要计算资源才能执行,每笔交易都需要付费。 在这个方面上,Gas 是指在以太坊成功进行交易所需的费用。


自我理解:

成功所需要的条件,有点类似于手续费

6. 代码开发(web3)

  1. 使用环境 node.js,版本v16.14.0

  2. 使用 ganache 来模拟以太坊节点

通过cmd命令执行:   ganache-cli 
  • 1

ganache 会随机创建 10 个账户,每个账户中都有100ETH的余额。

剩下调用web3API手册,参考地址:http://cw.hubwiz.com/card/c/web3.js-1.0/1/2/19/

6.1 主币交易

  1. 以太坊交易是指由外部持有的帐户发起的行动,换句话说,是指由人管理而不是智能合约管理的帐户。 例如,如果 Bob 发送 Alice 1 ETH,Bob 的帐户必须减少,Alice 必须被增加。 此状态更改的操作发生在交易中。
var Tx = require("ethereumjs-tx");  //交易对象
const Web3 = require("web3");   //web3对象 
const web3 = new Web3("http://localhost:8545/");  //监听端口

const account1 = "0xE9601370EDFC6Eed74c4a2b7CB21D9f3A2cea5a4";  //发送方地址
const account2 = "0xb599b52b8Ab9ECf7cbc51DB2A574dBE428c6d0D1";  //接收方地址

const privateKey1 =
      "54992c8a295713c9d19bee640967b6533b975cd5a911b5df6ca8bbdfcc547a23";  //发送者私钥
const privateKey2 =
      "3430eab5f9fa2235bbdc021e0378a4749acc24e9a3541c1f6a6747a5084e6e53";  // 接收者私钥


// 调用API方法获取主币余额 web3.eth.getBalance(查询的账户地址).then(console.log);
web3.eth.getBalance(account1).then(console.log);
// 调用API获取nonce方法
web3.eth.getTransactionCount(account1, (err, txCount) => {
    // 初始化交易对象
    const txObject = {
        from: account1,    
        nonce: web3.utils.toHex(txCount),  
        to: account2,  
        value: web3.utils.toHex(web3.utils.toWei("1", "ether")), 
        gasLimit: web3.utils.toHex(100000), 
        gasPrice: web3.utils.toHex(10),
        data: "",
    };
    //实例化交易对象
    const tx = new Tx.Transaction(txObject);
    // 签名
    tx.sign(Buffer.from(privateKey1, "hex"));
    const serializedTx = tx.serialize().toString("hex");
    console.log("serializedTx :", serializedTx);

    //发送交易
    web3.eth
        .sendSignedTransaction("0x" + serializedTx.toString("hex"))
        .on("receipt", console.log);
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

交易对象参数含义:

from: 发送方地址

to: 接收者的地方

nonce: 可以通过getTransactionCount方法获取,指当前账户交易次数

gasLimit:交易可以消耗的最大Gas数量

gasPrice:单次交易支付的手续费

data: 数据,在主币交易中可以写空,如果写了那么就是做一个备注

交易返回参数

交易成功会返回交易hash,可以调用API方法,查询交易信息

/**
 * 获得交易信息
 */
web3.eth.getTransaction("交易hash").then(console.log);
  • 1
  • 2
  • 3
  • 4

6.2 部署合约

智能合约只是一个运行在以太坊链上的一个程序。 它是位于以太坊区块链上一个特定地址的一系列代码(函数)和数据(状态)。

合约部署交易:没有“to”地址的交易,数据字段用于合约代码

/**
 * 部署合约返回合约地址
 */
const Tx = require("ethereumjs-tx");
const Web3 = require("web3");
const web3 = new Web3("http://localhost:8545");
var abi = require("web3-eth-abi");
const json = require("C:\\Users\\ZXK\\Desktop\\test2\\bin\\Commodity.json")
var from = { add: "发送方地址", key: "发送方私钥" };
var to = { add: "接收方地址", key: "接收方私钥" }
//读取编译后的二进制文件和json文件
var abiStr = json.abi;
var byte_code = json.bytecode;

/** 部署合约,获得合约地址*/
function deploy() {
    // 获得发送方nonce作为参数
    web3.eth.getTransactionCount(from.add, (error, nonce) => {
        if (error) {
            console.log("error====>", error);
        } else {
            console.log("获取nonce成功,值为===>", nonce);
            //获得nonce之后实例化对象
            var transaction = {
                //在部署合约不需要to参数
                nonce: web3.utils.toHex(nonce),
                from: from.add,
                gasLimit: web3.utils.toHex(6000000),
                gasPrice: web3.utils.toHex(web3.utils.toWei("15", "gwei")),
                data: "0x" + byte_code,
            }
            //实例化合约对象
            let tx = new Tx.Transaction(transaction);
            //签名交易
            tx.sign(Buffer.from(from.key, "hex"));
            //编译交易字符串
            let transactionStr = "0x" + tx.serialize().toString("hex");
            web3.eth
                .sendSignedTransaction(transactionStr)
                .on("receipt", function (receipt) {
                    console.log("部署成功=====>");
                    console.log("合约地址为====>", receipt.contractAddress);
                });
        }
    })
}
// 执行成功返回合约地址
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

6.3 通过合约调用合约方法

var address = "上面获得的合约地址";
// 合约实例对象
var Cin = new web3.eth.Contract(abiStr, address);
/**调用合约方法,查询代币余额 */
function getBalance(to) {
    //获取余额的方法
    Cin.methods.balanceOf(to).call((error, balance) => {
        if (error) {
            console.log("error===>", error);
        } else {
            console.log("balance===>", balance);
        }
    });
}
// 其余方法类似,只需要改方法名和参数即可
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/900002
推荐阅读
相关标签
  

闽ICP备14008679号