npm 包 @velma/ethereumjs-vm 使用教程

介绍

@velma/ethereumjs-vm 是一个 Ethereum 虚拟机,可以在本地执行智能合约,并提供了一系列的 API,方便开发者在 dApp 中使用。该 npm 包基于 EthereumJS 实现,支持 EVM 和 eWASM。

安装

使用 npm 或 yarn 安装:

--- ------- --------------------

或者

---- --- --------------------

快速上手

可以使用以下代码在本地创建一个简单的智能合约:

----- - --- --- - - --------------------------------
----- ------ - ------------------

----- ---- - -----------------------------
----- ------------ - - -------- ------ ------ ----- --
----- -- - --- ---- ---------------- ---- ---

---------- ----- --------- ---------- -- ------------- ----- ---- -- -
  --------------------

  ----------------------------------------
  -- ------- ----------------------------------------------------------------
  ---------------------------------------
  -- ------- -
---

在上述代码中,我们首先引入了 VM 和 abi,它们都是 @velma/ethereumjs-vm 中的常用 API。然后我们定义了一个 code 和一个 initialState,并创建了一个 VM 实例。

接着我们使用 runTx 方法执行了一个交易,该交易的 code 是上面定义的 codegasLimit 是指定的 gas 上限,initialState 是账户的状态。

如果执行成功,我们就可以通过 res.return 获取返回值,并通过 res.vm.gasUsed 获取使用的 gas 量。

API

VM

VM 是 @velma/ethereumjs-vm 的主要 API,可以用于在本地执行智能合约。VM 有以下重要方法:

runTx

用于执行交易。

------------ ------------- ---------

参数:

  • tx:Object,表示待执行的交易。交易包含以下属性:
    • to:String,表示接收地址,可选。
    • from:String,表示发送地址。
    • value:String,表示发送的 ETH 数量,可选。
    • gasPrice:String,表示 gas 价格。
    • gasLimit:String,表示 gas 上限。
    • nonce:String,表示 nonce,可选。
    • data:String,表示待执行的合约代码,可选。
  • initialState:Object,表示合约的初始状态。对象包含以下属性:
    • balance:String,表示 ETH 余额。
    • nonce:String,表示 nonce。
    • code:String,表示智能合约的代码,可选。
  • callback:Function,用于接收执行结果的回调函数。

runCall

用于执行一个合约,并返回输出值。

-------------- ------------ ---------

参数:

  • tx:Object,表示待执行的交易。交易包含以下属性:
    • to:String,表示接收地址。
    • from:String,表示发送地址。
    • value:String,表示发送的 ETH 数量,可选。
    • gasPrice:String,表示 gas 价格。
    • gasLimit:String,表示 gas 上限。
    • nonce:String,表示 nonce,可选。
    • data:String,表示待执行的合约代码,可选。
  • blockNumber:Number,表示区块号。
  • callback:Function,用于接收执行结果的回调函数。

abi

abi 用于处理智能合约的 ABI(Application Binary Interface)。ABI 是智能合约的接口,包含了合约地址、函数名和参数列表等信息。通过 ABI 我们可以与智能合约进行交互。在 @velma/ethereumjs-vm 中,我们可以使用 abi 的 encodeFunctionCall 方法编码函数调用,或使用 decodeCall 方法解码函数返回值。

encodeFunctionCall

用于编码函数调用,返回使用 ABI 编码后的数据。

------------------------------------- -----

参数:

  • jsonInterface:Object,表示函数的 ABI。
  • args:Array,表示函数的参数列表。

例如,对于以下合约:

-------- ------------- -
  ---- ------ -----

  -------- -------- -- ------ -
    ---- - --
  -

  -------- ----- ------ ---- ------- ------ -
    ------ -----
  -
-

我们可以使用以下代码编码调用 set 函数:

----- ----------- - -
  --------- ------
  ------- -- ----- ---- ----- --------- ---
  ----- ------
  -------- ---
  -------- ------
  ---------------- -------------
  ----- -----------
--

----- ---------- - ----

----- ------------ - ----------------------------------- --------------

--------------------------
-- ------- -------------------------------------------------------------------------

decodeCall

用于解码函数返回值,返回解码后的数据。

--------------------------------------- -------

参数:

  • jsonInterface:Object,表示函数的 ABI。
  • output:String,表示函数的返回值。

例如,对于以下合约:

-------- ------------- -
  ---- ------ -----

  -------- -------- -- ------ -
    ---- - --
  -

  -------- ----- ------ ---- ------- ------ -
    ------ -----
  -
-

我们可以使用以下代码解码调用 get 函数的返回值:

----- ----------- - -
  --------- -----
  ------- ---
  ----- ------
  -------- -- ----- --- ----- --------- ---
  -------- ------
  ---------------- -------
  ----- -----------
--

----- ----------- - ---------------------------------------------------------------------

----- ------------ - ------------------------------------- -------------

--------------------------
-- ------- - ----- -

示例代码

下面是一个完整的使用 @velma/ethereumjs-vm 的示例代码,该代码使用 JavaScript 定义了一个简单的 ERC20 智能合约。

----- - --- --- - - --------------------------------
----- ------ - ------------------

----- ------------- - -
  -
    ----- -----------
    ------- -
      - ----- ---------- ----- ----- --
      - ----- ---------- ----- -------- --
    --
    -------- -- ----- ------- ----- -- ---
  --
  -
    ----- ------------
    ------- -- ----- ---------- ----- -------- ---
    -------- -- ----- ---------- ----- --------- ---
  --
--

----- ------------ - -
------ -------- -------

-------- ----------- -
    ------- -------- -- ----- ---------

    -------- ---------------- ---- ------- ------- ------ ------- ----- -------- -
        ---------------------------- -- ------- ---- ------ ----------
        -------------------- -- -------
        ------------- -- -------
        ------ -----
    -

    -------- ----------------- ------- ------ ---- ------- -------- -------- -
        ------ -----------------
    -
-
--
----- -------------- - ---------------
----- -------------- - -
  -------- ---------------
  ------ ------
  ----- -------------
--

----------------------- -- -- -
  --- ---
  --- --------
  --- ---------

  ------------- -- -
    -- - --- ---- ---------------- ---- ---

    -------- - -------------------------------

    ------- - -----------------
  ---

  ---------- ------ ------- --------- ---- -- -
    -----------
      -
        --- --------
        ----- ---------------------------------------- -----------
      --
      ---------
      ----- ----- -- -
        --------------------

        ----- ------- - ------------------------------------------ -------------

        ------------------------------ ----------------

        -------
      --
    --
  ---

  ---------- -------- -------- ---- -- -
    ----- ---------------- - ---------

    ---------
      -
        --- --------
        ----- ---------------------------------------- -
          --------
          ---------------------------
        ---
        --------- -----------
        --------- -------
        ------ -------
      --
      ---------------
      ----- ----- -- -
        --------------------

        -----------
          -
            --- --------
            ----- ---------------------------------------- -----------
          --
          ---------
          ----- ----- -- -
            --------------------

            ----- ------- - ------------------------------------------ -------------

            ------------------------------ ------------------------- - ----------------------------------------

            -------
          --
        --
      --
    --
  ---
---

上面的代码中,我们首先引入了 VM 和 abi,然后定义了一个 ERC20 合约的 ABI 和合约代码。接着我们创建了一个 VM 实例,并使用 VM 的 compileScript 方法编译了合约代码,然后获取了合约地址。

我们通过两个测试用例展示了如何调用合约的函数。第一个测试用例调用了 balanceOf 函数,以获取账户余额。第二个测试用例调用了 transfer 函数,以转移账户余额。

总结

@velma/ethereumjs-vm 是一个非常有用的 npm 包,可以帮助前端开发者在本地运行智能合约,提高了合约的开发效率。本文通过一个简单的 ERC20 合约示例,较详细地介绍了 @velma/ethereumjs-vm 的使用方法和 API,希望对大家学习或开发智能合约有所帮助。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/60065f7a238a385564ab69e9


猜你喜欢

  • npm 包 mongoose-user-auth 使用教程

    简介 mongoose-user-auth 是一个基于 Mongoose 和 Express.js 的用户认证插件,在前端开发中具有广泛的应用。 本文将介绍如何通过使用 npm 包 mongoose-...

    3 年前
  • npm 包 concourse.js 使用教程

    介绍 concourse.js 是一个在 Node.js 和浏览器端都可用的轻量级 Web 框架,它通过提供易于使用的接口,大大简化了前端开发流程。在本篇文章中,我们将会介绍 concourse.js...

    3 年前
  • npm 包 dummy_xlsx 使用教程

    简介 npm 是 JavaScript 的包管理工具,可以方便地实现模块化开发和代码复用。dummy_xlsx 是一个 npm 包,主要用于生成假的 Excel 文件,供前端开发和测试使用。

    3 年前
  • npm 包 eslint-config-closure-base 使用教程

    什么是 eslint-config-closure-base eslint-config-closure-base 是一个基于 Google JavaScript 编码规范 的 ESLint 配置包。

    3 年前
  • npm 包 @tlaukkan/aframe-three-color-gradient-shader 使用教程

    简介 @tlaukkan/aframe-three-color-gradient-shader 是一个使用 three.js 创建的渐变颜色着色器,适用于 Aframe WebVR。

    3 年前
  • npm 包 fantasy-vue 使用教程

    fantasy-vue 是一个基于 Vue 的 UI 组件库,可以轻松地实现页面的快速渲染和交互。它提供了丰富的组件和 API,帮助前端开发人员可以更加快速地开发和维护 UI 界面。

    3 年前
  • npm 包 generator-qraimbault-vuejs 使用教程

    在前端开发中,我们经常需要使用一些工具和框架来简化我们的代码编写和开发流程。而 npm 就是其中非常常用的一个工具,它可以在项目中快速安装并使用各种插件和库。 在这篇文章中,我们将介绍一个非常有用的 ...

    3 年前
  • npm 包 line-maker 使用教程

    在前端开发中,我们经常需要使用线性图形,特别是在绘制图表或者表格中。为了快速地绘制直线,我们可以使用 npm 包 line-maker。 安装 使用以下命令可以在项目中安装 line-maker: -...

    3 年前
  • npm 包 @dmartss/next-hoc 使用教程

    在前端开发中,我们经常需要对组件进行一些公共逻辑的抽象。比如输入框需要实时校验,菜单需要权限控制等等。这时候我们就可以使用高阶组件(Higher-Order Component,简称HOC)来实现这些...

    3 年前
  • NPM包ng5-select2-ex的使用教程

    在前端开发中,经常会用到下拉框组件。但是原生的下拉框外观简单,无法满足我们的需求。这时候,第三方的下拉框组件就显得尤为重要了。其中,ng5-select2-ex是一款基于Angular5的下拉框组件,...

    3 年前
  • npm 包 @dmartss/redirect 使用教程

    在前端开发中,经常需要处理跳转和重定向,而 @dmartss/redirect 是一款常见的 npm 包,可以帮助我们实现跳转和重定向的功能。本文将详细介绍这个 npm 包的使用方法,包括安装、配置和...

    3 年前
  • npm 包 @dmartss/palette 使用教程

    颜色在设计和开发中扮演着重要的角色。随着颜色的数量增加,难以管理和组织颜色变得越来越具有挑战性。这时,颜色调色板成为了我们必不可少的工具。@dmartss/palette 就是一个强大的颜色调色板 n...

    3 年前
  • npm 包 @dmartss/simple-thunk 使用教程

    简介 在编写 Redux 应用时,我们经常需要进行异步操作,并且需要使用 Redux 提供的 redux-thunk 中间件来处理。使用 redux-thunk 中间件可以让我们在 action 中使...

    3 年前
  • npm包koapi-body使用教程

    在现代的前端开发中,通常需要使用到许多不同的工具和库来完成项目开发。其中,npm包是前端开发中最常见的一种工具。 koapi-body是一个npm包,提供了一种快速处理Koa框架API请求的方法。

    3 年前
  • npm 包 @opdime/bus 使用教程

    在前端开发中,许多开发人员都会用到 npm 包管理器来获取和管理依赖库。其中,一个非常有用的 npm 包就是 @opdime/bus,它是一款基于事件驱动编程的工具库,可以帮助我们更快速、更便捷地完成...

    3 年前
  • npm 包 eslint-closure 使用教程

    在前端开发中,代码质量的保证是非常重要的。而现代前端开发中,JavaScript 代码的复杂度和规模都在不断提高,如何保证代码的质量并避免不必要的错误就成为了开发者的一大问题。

    3 年前
  • npm 包 eslint-config-closure-es5 使用教程

    什么是 eslint-config-closure-es5 eslint-config-closure-es5 是一个基于 Google Closure Style Guide 编写的 JavaScr...

    3 年前
  • npm 包 iotp 使用教程

    1. 什么是 iotp iotp 是一个基于 Node.js 的可扩展物联网平台。它提供了一种简单的方式,能够使物理设备和人工智能交互。 iotp 包括两个核心组件:ioBroker 和 Homebr...

    3 年前
  • npm 包 in-ui-components-react 使用教程

    在现代 Web 开发中,组件化已成为一种不可或缺的技术。为了提高组件的复用性以及开发效率,我们通常会选择使用第三方 UI 库,其中 in-ui-components-react 就是一款非常优秀的 n...

    3 年前
  • npm 包 mysocket 使用教程

    mysocket 是一个基于 WebSockets 的通信库,它可以让你非常方便地在前端和后端之间建立实时通信。使用它可以轻松实现聊天室、实时数据同步、多人协作等功能。

    3 年前

相关推荐

    暂无文章