SPDX 版权声明

本章讲解 SPDX 语句的作用,以及如何选择 版权许可证

视频Bilibili  |  Youtube
官网binschool.app
推特@BinSchool    DiscordBinDAO   微信:bkra50 

下面是一个简单的 Solidity 编写的智能合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract HelloWorld{
  function greet() public pure returns(string memory) { 
    return "Hello World"; 
  } 
}

SPDX 语句通常位于 Solidity 智能合约文件的第一句。

SPDX 语句是一条注释语句,也就是说,如果合约代码中没有 SPDX 语句,那么功能也不会受到任何影响,照样可以运行。

但是,如果我们在代码中去除了 SPDX 语句,那么在编译合约的时候,就会出现下面的警告信息:

Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information. 

大意是:源文件缺少 SPDX 许可证标识,建议在发布前,使用 SPDX-License-Identifier 标识加上注释。

我们也建议在 Solidity 源文件中加入 SPDX 许可证标识语句,这样更符合 Solidity 编程规范。

SPDX 有什么用处

SPDX 即软件包数据交换(Software Package Data Exchange),它是一种用于描述软件许可信息的标准格式,它的内容包括许可证、版权和其他相关信息。

SPDX 规范由 Linux 基金会的 SPDX 工作组开发,旨在简化在不同的软件开发和分发渠道之间共享和跟踪软件许可信息的过程。

SPDX 的官方网站为:SPDX 许可证列表 |软件包数据交换 (SPDX),有需要了解细节的可以自行查看。

简而言之,SPDX 用于声明版权信息。

我们必须清楚,开源代码虽然源代码是公开的,但并不意味着可以免费使用。我们在使用别人代码的时候,先要搞清楚是否允许商用,防止出现侵犯版权的行为。

Solidity 中,就是使用 SPDX-License-Identifier 语句来声明版权许可证。

比如,SPDX-License-Identifier: MIT,就表明了这段代码使用的是 MIT 版权许可证。

我们在编写智能合约的时候,通常在文件首句使用 SPDX 来声明版权许可证。

SPDX 应该如何选择

MIT 是智能合约中最常见的版权许可证,具体描述如下:

特此免费授予获得(“软件”)副本的任何人不受限制地处理本软件的许可,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件副本的权利。
上述版权声明和本许可声明应包含在本软件的所有副本或大部分内容中。
本软件按“原样”提供,不附带任何明示或暗示的担保,包括但不限于适销性、特定用途的适用性和不侵权的担保。
在任何情况下,对于因本软件或本软件的使用或其他交易而引起、引起或与之相关的任何索赔、损害赔偿或其他责任,无论是在合同诉讼、侵权行为还是其他方面,均不承担任何责任。

简而言之,采用 MIT 许可证,就意味着任何人都能以任何方式使用代码,但是出了问题不负责。

通常,我们都会选择 MIT 作为智能合约的版权许可证,这也是大多数知名开源项目的选择。

比如,大名鼎鼎的安全基础库 OpenZeppelin,它使用的就是 MIT 许可证。

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

我们在编写智能合约的时候,直接抄写一遍放在合约开头即可。

// SPDX-License-Identifier: MIT

合约代码应该开源还是不开源

由于智能合约秉承了区块链数据公开的原则,它的代码通常都是开源的,这也是区块链项目取信于人的一种手段。

如果智能合约的源码不公开,那么就意味着该合约很可能埋伏着一些特殊目的,比如欺诈、后门等。

当然,也有一些项目方为了保护源码版权,或者对代码的安全性不自信,从而选择了不开源。

但是,智能合约最终是要发布到区块链上的,任何人都可以得到它的二进制代码。在代码量不大的情况下,还是非常容易被整体或者局部反编译,因而达不到保护源码的目的。

知名的 Defi 巨头 UniSwap,它的合约代码虽然是开源的,但许可证采用了 BUSL,并不是 MIT

// SPDX-License-Identifier: BUSL-1.1

BUSL 许可证与 MIT 非常相似,也是一种比较宽松的许可方式,但与 MIT  相比,还是附加了一些限制条件。

UniSwap 加入限制条件的主要原因:UniSwap 作为最著名的去中心化交易所,很多项目直接抄袭了它的代码,甚至有些项目的交易规模接近甚至反超了它,比如 SushiSwap,所以 UniSwap 出于商业利益的考虑,在版权声明中加入了一定的限制。