Zhuang's Diary

言之有物,持之以恒

发行

ERC 代币的发行已经标准化,最好采用 openzeppelin 的模板,并搭配 solidity5.x 版本和 truffle 工具使用,效果更佳。

1
2
3
4
5
6
7
8
9
10
// ERC 721
pragma solidity ^0.5.0;

import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol';
import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Mintable.sol';

contract MyNFT is ERC721Full, ERC721Mintable {
constructor() ERC721Full("MyNFT", "MNFT") public {
}
}
1
2
3
4
5
6
7
8
9
10
11
12
// ERC 20
pragma solidity ^0.5.0;

import 'openzeppelin-solidity/contracts/token/ERC20/ERC20.sol';
import 'openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol';
import 'openzeppelin-solidity/contracts/ownership/Ownable.sol';

contract MyERC20 is ERC20, ERC20Detailed, Ownable {
constructor(uint256 initialSupply) ERC20Detailed("MyToken", "MT", 18) public {
_mint(msg.sender, initialSupply);
}
}

Freeze 功能 (openzeppelin-contracts v3.2.0之后)

也叫做 pause 或者 close,具体就是停止 Token 相关的 transfer(转账)功能

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
48
49
50
51
52
// ERC 20
pragma solidity ^0.5.0;

import 'openzeppelin-solidity/contracts/token/ERC20/ERC20.sol';
import 'openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol';
import 'openzeppelin-solidity/contracts/ownership/Ownable.sol';

contract MyERC20 is ERC20, ERC20Detailed, Ownable {
bool public closed = false;

event Close();
event Open();

constructor(uint256 initialSupply) ERC20Detailed("MyToken", "MT", 18) public {
_mint(msg.sender, initialSupply);
}

// ------------------------------------------------------------------------
// Don't accept ETH
// ------------------------------------------------------------------------
function() external payable {
revert("Don't accept ETH");
}

function transfer(address _to, uint _value) whenOpen public returns (bool) {
return super.transfer(_to, _value);
}

function transferFrom(address _from, address _to, uint _value) whenOpen public returns (bool) {
return super.transferFrom(_from, _to, _value);
}

function close() onlyOwner whenOpen public {
closed = true;
emit Close();
}

function open() onlyOwner whenClosed public {
closed = false;
emit Open();
}

modifier whenOpen() {
require(!closed);
_;
}

modifier whenClosed() {
require(closed);
_;
}
}

openzeppelin-contracts v3.2.0版本中的实现代码如下 ERC721Pausable

1
2
3
contract ERC721PresetMinterPauserAutoId is Context, AccessControl, ERC721Burnable, ERC721Pausable {
......
}

MultiSigWallet 多方签名

gnosis 的 multisignature 功能最为完善。已经有多个生产项目采用此工具。目前此工具合约的 solidity 版本为0.4.15,项目语言版本交旧,但没有发生过安全问题。

首先 ERC20 合约的初始化总金额地址需要给到 MultiSigWallet 的合约地址,由 MultiSigWallet 合约完成多方签名确认后,ERC20 代币从 MultiSigWallet 合约的地址发送到接收人的账户地址。

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
48
49
50
// ERC 20
pragma solidity ^0.5.0;

import 'openzeppelin-solidity/contracts/token/ERC20/ERC20.sol';
import 'openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol';
import 'openzeppelin-solidity/contracts/ownership/Ownable.sol';

contract MyERC20 is ERC20, ERC20Detailed, Ownable {
bool public closed = false;

event Close();
event Open();

constructor(uint256 initialSupply) ERC20Detailed("MyToken", "MT", 18) public {
_mint(msg.sender, initialSupply);
}

// ------------------------------------------------------------------------
// Do accept ETH, deposit token in contract address
// ------------------------------------------------------------------------
function() external payable {}

function transfer(address _to, uint _value) whenOpen public returns (bool) {
return super.transfer(_to, _value);
}

function transferFrom(address _from, address _to, uint _value) whenOpen public returns (bool) {
return super.transferFrom(_from, _to, _value);
}

function close() onlyOwner whenOpen public {
closed = true;
emit Close();
}

function open() onlyOwner whenClosed public {
closed = false;
emit Open();
}

modifier whenOpen() {
require(!closed);
_;
}

modifier whenClosed() {
require(closed);
_;
}
}

Live website 地址在这里,以下操作均为https://wallet.gnosis.pm/上的截图。

1.增加钱包。如下图,完成钱包增加配置

2.点击 Wallets Name,即点击’Lcoin’,进入钱包的详细页面,如下图,进入后需要手动添加 Tokens Name,其后点击 Withdraw,最后经过 2 位 Required confirmations 后,Executed 状态变为 Yes

注意,此处,由 MultiSigWallet 合约完成多方签名确认后,ERC20 代币从 MultiSigWallet 合约的地址发送到接收人的账户地址(a825),MultiSigWallet 合约执行 transfer 给到接收人的账户地址(a825),所以 MultiSigWallet 合约的地址上需要有足够的 Eth 作为 gas

即使用 MultiSigWallet 转账时,花费的 gas 是 2 位 Required confirmations 和一次 transfer 的总和

3.如下图,虽然在 MultiSigWallet中可以选择到调用 ERC20 合约中的 close 函数,但是 close 函数并不受 MultiSigWallet 的控制,由onlyOwner,即 msg.sender 单独控制并操作

4.如下图,具体交易的内容在 MultiSigWallet,并配合etherscan 和 MyEtherWallet 中的结果

关联内容 ==> https://willzhuang.github.io/2020/09/07/ERC721%E5%AE%9E%E8%B7%B5/实践

1. 智能合约是可以删除的

删除智能合约的 EVM 字节码为 SELFDESTRUCT (之前称为 SUICIDE)。该操作系统会提供 gas 退款,激励用户删除存储状态的方式释放资源。删除智能合约并不会清楚合约之前历史的交易记录,区块链本身并不可改变。

2. Solidity 目前的版本号码是Version 0.5.9

其中主版本号是 0,它表示任何东西都有可能修改。次版本号是 5,在 Solidity 实际编码中,次版本号视为主版本号。9 为补丁号,实际编码中视为次版本号。当然建议开发者使用最新的版本。

3. ABI,Application Binary Interface,应用程序二进制接口

ABI 定义了数据结构和函数如何在机器指令中被访问。ABI 是向机器指令层面编码和解码并传送数据的主要方式。与 API 不同。ABI 对智能合约进行编码,具体是对 EVM 的调用和从交易获取数据的调用进行编码。例如,钱包软件调用 withdraw 函数时,需要通过 ABI 知道,该调用需要一个 uint256 类型的变量,变量名称为 withdraw_amount。然后钱包软件就会提示用户输入该参数,接着创建一个以太坊交易,调用合约的 withdraw 函数。

4. 智能合约设计中的安全设计模式

4.1 重入:典型案例为DAO。
  • 尽可能地使用内置的 transfer 函数想外部合约发送以太币。因为 transfer 仅会给外部调用2300gas,所以不足以支持目标地址或者合约再次调用其他合约,也就不足以重入发送以太币的合约。避免使用 send 或者 call。

  • 确保状态变量的修改都发生在合约发送以太币之前。即按照”检查-生效-交互”模式。

  • 引入互斥锁,也就是增加一个状态变量在代码执行中锁定合约,避免重入的调用。请参照智能合约退款方式一文

4.2 溢出:典型案例为美团币被盗。

使用 openzeppelin 的 safemath 做计算防范溢出。

4.3 以太币余额逻辑陷阱:典型案例为游戏应用中的存 ether,中奖 ether漏洞。
  • 避免使用 this.balance 的具体数值,它可能会被操纵。

  • 如果需要判断以太币的具体充值数额,可以使用一个自定义的变量在 payable 的数字中记录数额的变动。需要保证这个变量不会被 selfdestruct 调用强制发送的以太币所影响。

4.4 尽量避免使用 DELEGATECALL,尽量使用 library。保持库合约是无状态的,不会selfdestruct自我销毁的。典型案例 Parity 多重签名钱包的第二次共计漏洞。
4.5 保持正确的可见性,public/private/internal,不建议省略,因为省略即为 public。
4.6 区块链上的随机性目前还是一个难题。使用过往或者最近的变量都是灾难性的。

随机数必须来自区块链外部。或者,由像”提交-揭示”这样的模式在节点之间来实现。或者通过更改一组参与者之间的信任模型来实现。例如:randao , oraclize

4.7 参数攻击

向智能合约传递参数时,这些参数需要依照 ABI 规范进行编码。不过,发送的实际数据长度小于标准的参数编码长度也是可以的。在这种情况下,EVM 会在数据末尾补 0 使得数据长度达到要求。这可能会引起实际的转账以太币数量增长 10 倍,100倍甚至更高。防范方法是外部应用程序在把输入参数发送到区块链之前都应该对它们进行校验。由于数据填充发生在尾部,所以在合约中仔细考虑参数的顺序也可以在一定程度上减轻共计的危害。

4.8 Tx.Origin

智能合约中不应该使用Tx.Origin来进行验证授权。攻击者可以将共计合约的地址伪装成权限拥有人的地址,这样就可以通过验证,操作后续的(提款)逻辑。

Don’t roll your own crypto!

1.blockscout 成熟度 五星

https://github.com/poanetwork/blockscout

A tool for inspecting and analyzing EVM based blockchains. Blockchain explorer for Ethereum networks. 开发语言采用 erlang

2.explorer 成熟度 五星

https://github.com/carsenk/explorer

3.EthVM 成熟度 二星

https://github.com/EthVM/EthVM

EthVM is an open-source Blockchain Explorer focused mainly on Ethereum (although other networks and forks will be supported over time) under the SSPL license (a small variation of the GNU Affero License v3) and written in a mixture of different languages.

You can use EthVM as a tool to explore your custom private network or the existing public ones or as a ETL (Extract, Transform, Load) platform to perform different analysis on the data.

本人很看好 EthVM 项目,他还结合了 ETL 的功能。希望 EthVM 项目可以越办越好。

4.Aleth 成熟度 五星

https://aleth.io/

Lite version in here , lite version don’t have any database, it is a live website.

在我看来,下面这些是加密货币钱包需要的:

  • 私钥 - 由钱包来控制用户的私钥
  • 易用性 - 优雅的用户界面,易于用户使用
  • 开发社群 - 活跃的开发社群支持钱包不断更新和优化
  • 备份和安全 - 备份和恢复的特性
  • 兼容性 - 与不同的操作系统相兼容

个人认为,在寻找钱包时,需要确保满足上述要求。在这里,我列出了以太坊最好的钱包。 它们都符合上述要求。

1.Ledger Nano S (Hardware Wallet)](https://www.ledger.com/)

Ledger Nano S是最便宜的以太坊硬钱包之一(65美元)。此处,以太币在设备上脱机存储。 无论何时想花费以太币,Ledger都会使用存储在设备上的私钥对其进行签名。您可以存储ETH和ETC。

关于Ledger Nano S最棒的地方是它配备了一个小型OLED屏幕,可以控制您的交易。安全性非常强大,即使在黑客计算机上也可以使用Nano S设备。

2. Trezor (Hardware Wallet)

Trezor是比特币发明的第一个硬件钱包。但是,现在Trezor也可以通过MyEtherWallet Web界面用于以太坊。它还将以太币脱机存储在安全的电子芯片上,只有在您使用密码登录时才能激活。它是一种非常轻便的便携式设备,售价99美元。

3. Atomic (Desktop)

Atomic钱包是以太坊和ERC20 Token的终极解决方案。钱包可以使用银行卡存储,交换和购买ETH。将来,以太坊将可用于交换Atomic Swaps——这是一种完全分布式的方式,用于在不涉及中介的情况下做 Token 交易。

Atomic Wallet支持300多种加密货币,提供所有ERC20 Token 报价的界面。基本上,您可以输入联系地址并在自己的原子钱包中使用自定义代币。钱包会对您设备上的私钥进行加密,并为您提供对资金的完全访问权限和控制权。

Atomic Wallet适用于任何桌面操作系统,适用于Android和iOS设备。

4. Exodus (Desktop Wallet)

Exodus是世界上第一个多加密货币桌面钱包。免费使用,用户界面非常具有吸引力。当您打开Exodus钱包,饼图就会显示您的整个Token组合。Exodus是第一款内置ShapeShift用于交换加密货币的桌面钱包。但是,在使用Exodus时,需要始终连接到互联网,但您不必担心,因为您的私钥永远不会离开您的机器。并且用于还原钱包的一键式电子邮件恢复和备份种子密钥等功能可确保您的资金安全。

Exodus现在支持近100种加密货币!他们还有多个交易所合作伙伴(不仅仅是ShapeShift),这意味着我们可以提供更多可交换资产。从各个合作伙伴那里获取流动资金使得Exodus的交换更快更可靠。

他们也不需要个人电子邮件 - 这是希望收到电子邮件备份链接的人的选项。可以使用任何电子邮件地址 - 或者根本不使用!电子邮件仅用于发送备份链接一次。隐私对Exodus非常重要,他们不存储任何客户个人数据 - 甚至不包括电子邮件地址。

5. Jaxx (Mobile Wallet)

Jaxx是一个多资产钱包,由总部位于加拿大Decentral创建。它支持13种加密货币(包括ETH),具有优雅的设计和健壮的安全特性。

在Jaxx上,私有密匙永远不会离开设备,而种子密匙等特性使您能够在需要时恢复资金。

它有一个惊人的开发社区,负责产品的创新和维护。

支持平台桌面(Windows, Mac OS, Linux),扩展(Chrome, Firefox),移动/平板(苹果,Android)。不需要注册或个人信息。支持智能合同。

Jaxx钱包适用于Android、iOS、Mac OS、Windows和Linux。他们还将在未来几个月推出一款硬件钱包。

6.MetaMask (Desktop Wallet)

MestaMask是我最喜欢的以太钱包之一。

它就像一个浏览器访问以太网络。它不仅使您能够存储和发送Ethereum,还允许您访问Dapp程序。

它有一个直观的设计,您可以在测试网络和主要以太网络之间快速切换。

私钥是密码加密的,存储在您的机器上,您可以随时导出。

支持的平台:Firefox,Chrome extensions。不需要注册或个人信息。支持智能合同。

7.MyEtherWallet (Web Wallet)

MestaMask是我最喜欢的以太钱包之二 :)。

MyEtherWallet是一个离线的冷钱包,在这里你可以控制本地机器上以太坊的私钥。

它是一个开源钱包,无需第三方服务器,可以在其中编写和访问智能合同。它有一个内置的BTC到ETH,以及多币种(反之亦然)交易设施。您还可以连接您的Trezor或Ledger Nano S,以访问您的资金在MyEther的浏览器环境。

8. Coinbase (Mobile Wallet)

Coinbase支持比特币和以太坊。

这是一种既便宜又快捷的储存以太的方法,前提是它们为你的国家服务。你可以在这里查一下你们国家是否有他们的服务。如果是,请按照以下步骤使用Coinbase:

  1. 在Coinbase登记(邮箱注册,注册个人信息)。

  2. 获取你的公共地址。

  3. 把你的电子计算机转移到Coinbase的公共地址。

  4. 将ETH存储在Coinbase上。

然而,缺点是私钥不在您的控制中,因为它们存储在Coinbase的托管服务器上。Coinbase不支持智能合约。

也就是说,这是一种很好的短期储存ETH的方法。如果打算长期持有以太币,应该使用纸质钱包的方法或使用像Ledger Nano S这样的硬件钱包。

Research on Blockchain Application in Insurance Industry

全文: PDF (4379 KB) HTML (1 KB)

输出: BibTeX | EndNote (RIS)

Abstract:Blockchain technology will play an important role in digital transformation in insurance industry. This paper attempts to introduce CBGM (Consortium Blockchain Governance Model) which can help insurance institutions to leverage blockchain technology to build insurance digital ecosystem more efficiently. This paper leverages authors experience of applying blockchain technology in insurance industry recent years. Firstly, application scenarios of blockchain in insurance industry has been sorted out. Meanwhile, the challenges of using blockchain technology has been analyzed, whose one of the key challenges is how to manage consortium. Secondly, CBGM and 6 sub-modules have been developed and introduced which is targeted to provide common method to manage consortium. Finally, an example of using CBGM has been shared and proposal for insurance institution has been provided.
Key words: blockchain insurance consortium governance model project implementation