如何用npm安装Solidity编译器?

478 阅读8分钟

在这篇文章中,我们将通过安装solc-js ,Solidity Compiler的一个变种来航行。像往常一样,伴随着主要的话题,还会有一些其他有用的和支持性的话题,所以让我们一起坚持下去,再大胆地向前迈一步吧😉

版本管理

Solidity的官方文档告诉我们,Solidity遵循一种叫做语义版本控制的标准。简而言之,通过考虑到我们如何对我们的项目和依赖关系进行版本管理,语义版本管理总结帮助我们保持对项目的控制。

语义版本管理

我不会详细介绍语义版本学,因为优秀的信息可以在原始文件中找到。不过,我知道,对于一些读者来说,这样的技术文档可能是非常枯燥的阅读材料,所以我觉得在我们继续讨论主要议题之前,亲手挑选几个关键术语并加以澄清是非常有用的。

当我们参与更大的老项目时,我们几乎不可避免地会遇到系统不同部分的多个版本,如库和其他依赖性。可悲的是,当系统的某些部分没有正确的版本控制时,我们很可能会遇到一种项目的状态(更经常的是,一种同样的心理状态),叫做 依赖性地狱.

💡 依赖性地狱 是两种可能状态的结合,或者说是其中的一种:版本锁定版本杂乱

  • 版本锁是一个术语,描述了一种使软件包的依赖性规范过于严格的现象。版本锁的后果是 "无法在不发布每个依赖包的新版本的情况下升级一个包"。换句话说,整个依赖关系的层次结构必须被重建和重新发布。
  • 版本杂乱是一个描述相反现象的术语,即使一个包的依赖性规范过于宽松。换句话说,当我们作为开发人员假定与更多的未来版本的兼容性超过合理范围时,现实证明我们是错误的,也就是说,会出现意想不到的不兼容现象。

语义版本规范(Semantic Versioning specification)的作者(T. Preston-Werner等人)提出了一种解决依赖性地狱问题的方案,其形式为

"一套简单的规则和要求,规定了版本号的分配和递增方式。这些规则是基于但不一定局限于封闭和开源软件中预先存在的广泛的通用做法。"。

给定一个版本号MAJOR.MINOR.PATCH,递增。

  • 当你做不兼容的API修改时,增加MAJOR 版本
  • 当你以向后兼容的方式增加功能时,MINOR 版本。
  • 当你进行向后兼容的错误修复时,PATCH 版本。

预发布和构建元数据的额外标签可作为MAJOR.MINOR.PATCH格式的扩展。

通过对什么是语义版本管理进行简明扼要的概述,我们将继续关注的主要话题:Solidity编译器的安装。

Solidity版本控制的细节

需要指出的是,Solidity 补丁级版本具有显著的版本号A ,例如:A.x.y 从来不包含破坏性的修改或改进。

换句话说,用版本A.x.y 编译的代码将总是用A.x.z 编译(有条件的z > y )。当A = 0 ,它被认为是初始开发的重要版本,意味着它特别容易被修改。

Solidity 文档另外指出,除了发布版本,夜间开发构建也是可用的。夜间开发构建使开发者能够尝试即将到来的功能,并向Solidity开发者提供早期反馈,这是一个很好的现场测试的方法。然而,我们应该意识到,无论夜间开发版本的稳定性如何,都不能保证代码始终正常工作。

💡 注意:夜间开发构建的代码永远不应该包括在生产使用中。

在这一点上,合同部署过程应该使用最新发布的 Solidity 版本,根据定义,它定期包括所有的突破性变化、新功能和错误修复。

混搭

Remix是一个集成开发环境(IDE),用于开发、部署和管理类Ethereum区块链的智能合约。

它也通常被用作学习平台,比如在我们的文章跟读练习中。

Remix有三种形式,即作为一种网络应用,可在线使用(https://remix.ethereum.org/)、桌面应用程序(https://github.com/ethereum/remix-desktop/releases),或者实时部署(https://github.com/ethereum/remix-live/tree/gh-pages).

正如Solidity作者所说"我们推荐Remix用于小型合约和快速学习Solidity"。

无论哪种风味,Remix都是测试Solidity的夜间部署构建的方便选择。

Solidity编译器软件

在下面的章节中,我们将走过Solidity命令行编译器的几个本地(离线)变体的安装。我将在后续中进行安装的操作系统是Windows 10.0.19043.1889和Ubuntu Linux 20.04.4 LTS。

当我们在做涉及大型合同的项目时,或者当我们需要更多的编译选项时,例如Remix,命令行编译器是最佳选择。

solc-js - Ubuntu上的npm / Node.js变体

在我们使用npm ,一个用于Node.js包(模块)的包管理器之前,我们必须在命令行中输入npm ,以检查它是否已经可用。

$ npm
Command 'npm' not found, but can be installed with:
sudo apt install npm

我的Ubuntu环境目前还没有安装npm ,因此我将继续安装它。

ℹ 信息:Node.js是一个异步的、事件驱动的JavaScript运行时间(https://nodejs.org/en/about/).

💡 注意:请记住,下面列出的输出只有一个象征性的目的,在其他环境中可能会有不同的外观。

$ sudo apt install npm
[sudo] password for matija: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
gyp libc-ares2 libjs-inherits libjs-is-typedarray libjs-psl 
# … (there is an exhaustive list of the packages to be installed, but I’ll leave out the remainder since it has no real value for us as readers)
Need to get 14,9 MB of archives.
After this operation, 76,0 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

在npm安装完成后,我们可以继续进行并全局性地(-g)安装solc-js

sudo npm install -g solc

我们已经步入了一个我之前没有提到的技术领域,所以我编了一些注释/信息块,只是为了给我们介绍和澄清这些新的部分。

💡 注意:虽然命令中提到了 编译器,但被安装的是 编译器(注意solc solc-js Javascript中的 "js")。 是通过使用Solc-js *Emscripten*从C++的 衍生出来的项目,这意味着 和 都使用相同的编译器源代码。然而, 可以用于JavaScript项目,例如Remix。 的主要缺点是没有完全利用 编译器的功能,即 编译器比 编译器支持的功能少。solc solc solc-js solc-js solc-js solc solc-js solc

ℹ 信息"Emscripten是一个完整的WebAssembly的编译工具链,使用LLVM,特别关注速度、大小和网络平台。"(https://emscripten.org/).Emscripten使我们能够将用C、C++或任何使用LLVM的语言编写的项目编译到浏览器、Node.js或wasm(WebAssembly)运行时。

ℹ 信息"LLVM项目是一个模块化和可重复使用的编译器和工具链技术的集合"。 (https://llvm.org/).LLVM最初是低级虚拟机的首字母缩写。然而,这个项目的发展已经超出了它最初的范围,只保留了这个名字。

ℹ 信息"WebAssembly(缩写为Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm被设计为编程语言的可移植编译目标,使客户端和服务器应用程序能够在网络上部署。"(https://webassembly.org/).WebAssembly是由我们用C/C++、C#和Rust编程语言编写的代码产生的低级、类似汇编的语言代码。WebAssembly旨在以接近原生的性能在网络浏览器中运行。

有时我们需要更新Node.js,例如,当我们在安装solc-js 过程中收到npm的警告,说node版本太低(需要提到v8.x ,并≥v12 的消息)。

在这种情况下,我们可以按照这些步骤,更新Node.js。

第1步:清理npm缓存。

sudo npm cache clean -f

第2步:安装n,Node的版本管理器。

sudo npm install -g n

第3步:安装最新的稳定版本。

sudo n stable

第4步:检查你的Node.js安装的版本。

node -v

如果上面的命令仍然显示旧的node版本,让系统忘记记忆的位置。

hash -r

ℹ 信息"Linux系统中的哈希命令是bash的内置命令,用于维护最近执行的程序的哈希表。" (https://www.geeksforgeeks.org/hash-command-in-linux-with-examples/)

当你重新检查你的Node.js安装的版本时,它现在应该显示最新的稳定版本。

$ node -v
v16.17.0

现在我们的node(Node.js)版本是最新的,我们可以检查solc-js 的安装版本。

$ solcjs – version
0.8.16+commit.07a7930e.Emscripten.clang

我们当前的solcjs 版本已经列在上面,检查结果显示我们已经安装了最新的solcjs 版本(我在输出中只保留了相关列)。

npm search solc | grep -w "solc"
NAME   | DATE       |VERSION | DESCRIPTION
solc   | 2022-08-08 | 0.8.16 | ethereum solidity compiler
…

这最后一步完成了我们安装 Solidity 编译器solc-js 的程序。

总结

在这篇文章中,我们开始了一个关于使用和安装 Solidity 编译器的多文章主题。有几种方法,其中我们研究了通过npm(一个Node.js数据包管理器)安装Solidity编译器的方法,solc-js

首先,我们从一般的角度和有关Solidity的角度来看看什么是语义版本控制。在其他文献和在线资源中可以获得更多关于版本控制的信息,但是考虑到我们的主要议题,在这一点上没有必要再深入下去。

第二,我们很快就重新讨论了Remix的话题:它是什么,如何使用,以及以何种形式使用。

第三,我们把很大一部分注意力放在通过npm(一个Node.js包管理器)安装Solidity编译器solc-js 。除了主要的思想,我们还研究了一个可能的问题,即Node.js的不足即旧版本,并做了一系列的步骤来纠正这个问题,使我们的系统达到一个最新的状态。