标签 以太坊 下的文章

这段时间以来,以太坊通证很流行。这些通证可以用来代表现实世界的各种价值单位:黄金谎言猫咪 甚至是类似 公司股票 一样的东西。迄今为止,人们已经募集了 20 亿美元的通证。那些通证是以 ERC20 为标准的,人们可以轻松地在钱包之间进行交易。在这篇教程中,我准备指导你部署你自己的 ERC20 通证到真实的以太坊网络上去。

事先准备:

  • 一个文本编辑器(Atom 不错,不过我喜欢 Vim
  • 对命令行和终端(模拟器)有起码的了解。Mac 内置的应用“终端”就很好,不过我喜欢 iTerm2
  • Chrome 浏览器
  • Node.js 8(或更高版本)
  • 你的通证的名字。我的准备叫做 HamburgerCoin(汉堡币)

你需要做的第一件事是安装 MetaMask。访问 Metamask 网站 并点击“Get Chrome Extention”。

Metamask 可以让你通过 Chrome 在以太坊上进行交易。它依靠运行着公开以太坊节点的 Infura ,所以你不用自己运行以太坊全节点。如果你颇具探索精神,你也可以下载和安装 Mist 以替代它。运行 Mist 就可以让你运行你自己的以太坊节点。运行自己的节点你就需要将你的计算机与该网络进行同步,这需要不短的时间。从技术上讲这更安全,因为这样你不必信任 Infura 来处理你的交易。Infura 可以忽略你的交易而干预你,但是它并不能偷走你的钱。因为安装 Metamask 比 Mist 更快也更简单,所以我假设你在下面的教程中使用 Metamask。

接着你需要安装 truffle

 $ npm install -g truffle

现在为你自己的新通证创建一个新目录,cd 到其中并初始化你的 truffle 项目。

$ mkdir hamburger-coin
$ cd hamburger-coin
$ truffle init

很好,你的 truffle 项目已经设置好了!

现在来创建我们的通证。首先我们需要安装 OpenZepplin 框架。OpenZepplin 框架包括了大量预先构建好的合约,包括我们要部署的 ERC20 通证合约。

(只需要按下回车接受默认值即可)

$ npm init
package name: (hamburger-coin)
version: (1.0.0)
description:
entry point: (truffle.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/masonf/src/hamburger-coin/package.json:

{
  "name": "hamburger-coin",
  "version": "1.0.0",
  "description": "",
  "main": "truffle.js",
  "directories": {
    "test": "test"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) yes
$ npm install zeppelin-solidity

现在我们可以创建我们的通证合约了。创建一个 contracts/HamburgerCoin.sol 文件并加入如下内容:

pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/StandardToken.sol";

contract HamburgerCoin is StandardToken {
  string public name = "HamburgerCoin"; 
  string public symbol = "HBC";
  uint public decimals = 2;
  uint public INITIAL_SUPPLY = 10000 * (10 ** decimals);

  function HamburgerCoin() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
  }
}

(LCTT 译注:上述合约内容中指定了合约的名称、符号和供应量。在 ERC20 当中,通证的供应量其实是整数,上述合约中通证的实际供应量是 10000 * 100 个,出于显示 2 位小数的需求,你在合约浏览器、钱包软件中看到和操作的 1 个通证,实际上在交易中是以 100 个进行的。)

OpenZepplin 的 StandardToken 是一个标准的 ERC20 通证。如果你感兴趣,你可以看看它的 源代码 以了解是如何工作的。

实际上并不太复杂。该合约有一个 地址到余额 的映射(LCTT 译注:你可以理解为哈希、关联数组),它也有一个 允许转账 的列表。你可以看做是支票。你可以写张支票,但是直到它被兑付前,钱并不会被转账。

如果有人要转走一些资金,你可以在合约上调用 approve 方法,设置你要发送的通证数量。这就像是写支票一样。

然后调用 transferFrom 会实际进行转账。

我们可以从头写这些合约,但是最好采用经过完备的社区测试的合约。从头写一个 ERC20 通证那就是另外一篇文章了。

试着运行 compile 来编译我们的合约:

$ truffle compile
Compiling ./contracts/HamburgerCoin.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/ownership/Ownable.sol...
Compiling zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/MintableToken.sol...
Compiling zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts Next you'll need to add a migration file which will tell truffle how to deploy your contract.

接下来我们需要增加一个 truffle 迁移

创建 migrations/2_deploy_hamburgercoin.js 文件并添加如下内容:

var HamburgerCoin = artifacts.require("./HamburgerCoin.sol");

module.exports = function(deployer) {
  deployer.deploy(HamburgerCoin);
};

现在让我们配置 truffle 以能够使用 Infura 公共节点。如果我们要部署到公共节点,那就需要钱包的私钥。我们可以将该私钥包含在我们的源代码当中,但是如果任何人可以访问你的源代码(和版本库),他就能够偷走我们所有的汉堡币!要避免这种情况,我们会使用 dotenv node.js 模块。(LCTT 译注:dotenv 用于存储机密信息的文件 .env 是以 “.” 开头的,默认不会进入版本库,当然,如果有人能查看你全部的项目文件,你的私钥还是会被泄露。)

让我们安装部署到 Infura 所需的所有模块。

npm install --save-dev dotenv truffle-wallet-provider ethereumjs-wallet

(LCTT 译注:可能安装过程中会有很多警告,大多应该是属于定义了未使用的变量和方法的编译警告,可以忽略。)

现在编辑 truffle.js 并(原样)加入如下内容:

require('dotenv').config();
const Web3 = require("web3");
const web3 = new Web3();
const WalletProvider = require("truffle-wallet-provider");
const Wallet = require('ethereumjs-wallet');

var mainNetPrivateKey = Buffer.from(process.env["MAINNET_PRIVATE_KEY"], "hex")
var mainNetWallet = Wallet.fromPrivateKey(mainNetPrivateKey);
var mainNetProvider = new WalletProvider(mainNetWallet, "https://mainnet.infura.io/");

var ropstenPrivateKey = Buffer.from(process.env["ROPSTEN_PRIVATE_KEY"], "hex")
var ropstenWallet = Wallet.fromPrivateKey(ropstenPrivateKey);
var ropstenProvider = new WalletProvider(ropstenWallet, "https://ropsten.infura.io/");


module.exports = {
  networks: {
    development: {
      host: "localhost",
      port: 8545,
      network_id: "*" // Match any network id
    },
    ropsten: {
      provider: ropstenProvider,
      // You can get the current gasLimit by running
      // truffle deploy --network rinkeby
      // truffle(rinkeby)> web3.eth.getBlock("pending", (error, result) =>
      //   console.log(result.gasLimit))
      gas: 4600000,
      gasPrice: web3.toWei("20", "gwei"),
      network_id: "3",
    },
    mainnet: {
      provider: mainNetProvider,
      gas: 4600000,
      gasPrice: web3.toWei("20", "gwei"),
      network_id: "1",
    }
  }
};

(LCTT 译注:原文采用 new Buffer 来获取私钥设置,但 node.js 升级后,废弃了 new Buffer 这种用法,运行时会发出警告,所以上面我修改为使用 Buffer.from 。)

接下来我们从 Metamask 中得到我们的私钥:

  1. 点击你的 Chrome 窗口右上角的狐狸图标。
  2. 点击 “Account 1” 右侧的省略号。
  3. 点击 “Export Private Key”。
  4. 输入你的密码。
  5. 点击该文字以复制私钥到剪贴板。

然后打开 .env文件,并像下面这样贴入你的私钥(对于 Ropsten 测试网和 Mainnet 主网,你的私钥是一样的):

ROPSTEN_PRIVATE_KEY="123YourPrivateKeyHere"
MAINNET_PRIVATE_KEY="123YourPrivateKeyHere"

接下来,让我们部署到 Ropsten 以太坊测试网。

以太坊测试网是一个你可以测试合约的地方。此外还有 KovanRinkeby 测试网。我在这个教程中选择 Ropsten 是因为现在很容易得到 Ropsten 的测试 ETH。这些测试网都类似,你可以使用任何一个你喜欢的,但是在此教程当中我假设你在使用 Ropsten。访问 https://faucet.metamask.io/ 以得到一些测试 ETH。从 faucet 得到一些 ETH 后,你就可以部署了。

$ truffle deploy --network ropsten
Compiling ./contracts/HamburgerCoin.sol...
Compiling ./contracts/Migrations.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts

Using network 'ropsten'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xc2bbe6bf5a7c7c7312c43d65de4c18c51c4d620d5bf51481ea530411dcebc499
  Migrations: 0xd827b6f93fcb50631edc4cf8e293159f0c056538
Saving successful migration to network...
  ... 0xe6f92402e6ca0b1d615a310751568219f66b9d78b80a37c6d92ca59af26cf475
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying HamburgerCoin...
  ... 0x02c4d47526772dc524851fc2180b338a6b037500ab298fa2f405f01abdee21c4
  HamburgerCoin: 0x973b1a5c753a2d5d3924dfb66028b975e7ccca51
Saving artifacts...

在 “Saving aritfacts” 上面的这行即是你的合约的新地址。

复制并黏贴该地址到 Ropsten Etherscan 搜索框,你就能看到你新部署的合约。

现在你可以在任何 ERC20 兼容的钱包,如 MistMyEtherWallet(LCTT 译注:或 ImToken 这样的手机应用)里面使用你的通证了。

为了这篇教程,我构建了一个名为 Etherface 的钱包来做演示。

首先你需要添加你的通证到 Etherface:

  1. 访问 http://etherface.io/
  2. 确认你在 Metamask 中选择了 “Ropsten” 网络。
  3. 点击 “Tokens”。
  4. 点击右上角的加号按钮。
  5. 输入上面的合约地址。

如果你有朋友想要一些汉堡币,你现在就可以发送给他们了。如果没有,你也可以在你的两个账号间测试转账:

  1. 在 Metamask 中点击 “切换账号”按钮(在右上角),并改变你的账号为 “Account 2”。
  2. 点击 “Account 2” 右边的省略号,然后选择 “Copy Address to clipboard”。
  3. 切换回 “Account 1”,这很重要!否则交易会失败。
  4. 在 Etherface 中你的余额下点击 “Send”。
  5. 黏贴 “Account 2” 的地址。
  6. 输入你要发送的数量。
  7. Metamask 会弹出确认窗口,点击 “Submit”。
  8. 等大约 15-30 秒。
  9. 你的 “Account 1” 的余额应该会减少,“Account 2” 现在会有了一些汉堡币!

最后,让我们来部署到主网(LCTT 译注:这会花费你真实的 ETH,你可以通过查看前面部署到 Ropsten 的合约信息中了解花费了多少 gas,以相应估计实际要花费多少 ETH):

$ truffle deploy --network mainnet

你可以如前面一样加你的通证到 Etherface ,并发送你新打造的通证给你的朋友们了!

“对于标准来说,最好的事情莫过于大量的人都去选择使用它。“

—— Andrew S. Tanenbaum

通证标准的现状

在以太坊平台上,通证标准的现状出奇的简单:ERC-20 通证 token 标准是通证接口中唯一被采用( EIP-20)和接受的通证标准。

它在 2015 年被提出,最终接受是在 2017 年末。

在此期间,提出了许多解决 ERC-20 缺点的 以太坊意见征集 Ethereum Requests for Comments (ERC),其中的一部分是因为以太坊平台自身变更所导致的,比如,由 EIP-150 修复的 重入 re-entrancy bug。其它 ERC 提出的对 ERC-20 通证模型的强化。这些强化是通过收集大量的以太坊区块链和 ERC-20 通证标准的使用经验所确定的。ERC-20 通证接口的实际应用产生了新的要求和需要,比如像权限和操作方面的非功能性需求。

这篇文章将浅显但完整地对以太坊平台上提出的所有通证(类)的标准进行简单概述。我将尽可能客观地去做比较,但不可避免地仍有一些不客观的地方。

通证标准之母:ERC-20

有成打的 非常好的 关于 ERC-20 的详细描述,在这里就不一一列出了。只对在文章中提到的相关核心概念做个比较。

提取模式

用户不太好理解 ERC-20 接口,尤其是从一个 外部所有者帐户 externally owned account (EOA)转账 通证的模式,即一个终端用户(“Alice”)到一个智能合约的转账,很难正确理解 approve/transferFrom 模式。

从软件工程师的角度看,这个提取模式非常类似于 好莱坞原则 Hollywood Principle (“不要给我们打电话,我们会给你打电话的!”)。那个调用链的想法正好相反:在 ERC-20 通证转账中,通证不能调用合约,但是合约可以调用通证上的 transferFrom

虽然好莱坞原则经常用于去实现 关注点分离 Separation-of-Concerns (SoC),但在以太坊中它是一个安全模式,目的是为了防止通证合约去调用外部合约上的未知的函数。这种行为是非常有必要的,因为会出现 调用深度攻击 Call Depth Attack ,直到 EIP-150 被启用才解决。在这个硬分叉之后,这个重入 bug 将不再可能出现了,并且提取模式也不能提供任何比直接通证调用更好的安全性。

但是,为什么现在它成了一个问题呢?可能是由于某些原因,它的用法设计有些欠佳,但是我们可以通过前端的 DApp 来修复这个问题,对吗?

因此,我们来看一看,如果一个用户使用 transfer 去发送一些通证到智能合约会发生什么事情。Alice 对通证合约的合约地址进行转账,

….啊啊啊,它不见了!

是的,通证没有了。很有可能,没有任何人再能拿回通证了。但是像 Alice 的这种做法并不鲜见,正如 ERC-223 的发明者 Dexaran 所发现的,大约有 $400.000 的通证(由于 ETH 波动很大,我们只能说很多)是由于用户意外发送到智能合约中,并因此而丢失。

即便合约开发者是一个非常友好和无私的用户,他也不能创建一个合约以便将它收到的通证返还给你。因为合约并不会提示这类转账,并且事件仅在通证合约上发出。

从软件工程师的角度来看,那就是 ERC-20 的重大缺点。如果发生一个事件(为简单起见,我们现在假设以太坊交易是真实事件),对参与的当事人应该有一个提示。但是,这个事件是在通证的智能合约中触发的,合约接收方是无法知道它的。

目前,还不能做到防止用户向智能合约发送通证,并且在 ERC-20 通证合约上使用这种不直观的转账将导致这些发送的通证永远丢失。

帝国反击战:ERC-223

第一个尝试去修复 ERC-20 的问题的提案是 Dexaran 提出来的。这个提议通过将 EOA 和智能合约账户做不同的处理的方式来解决这个问题。

强制的策略是去反转调用链(并且使用 EIP-150 解决它现在能做到了),并且在正在接收的智能合约上使用一个预定义的回调(tokenFallback)。如果回调没有实现,转账将失败(将消耗掉发送方的燃料,这是 ERC-223 最常被批评的一个地方)。

好处:

  • 创建一个新接口,有意使用这个废弃的函数来不遵守 ERC-20
  • 允许合约开发者去处理收到的通证(即:接受/拒绝)并因此遵守事件模式
  • 用一个交易来代替两个交易(transfer vs. approve/transferFrom)并且节省了燃料和区域链的存储空间

坏处:

  • 如果 tokenFallback 不存在,那么合约的 fallback 功能将运行,这可能会产生意料之外的副作用
  • 假如合约使用通证转账功能的话,比如,发送通证到一个特定的像多签名钱包一样的账户,这将使 ERC-223 通证失败,它将不能转移(即它们会丢失)。

程序员修练之道:ERC-677

ERC-667:transferAndCall 通证标准 尝试将 ERC-20 和 ERC-223 结合起来。这个创意是在 ERC-20 中引入一个 transferAndCall 函数,并保持标准不变。ERC-223 有意不完全向后兼容,由于不再需要 approve/allowance 模式,并因此将它删除。

ERC-667 的主要目标是向后兼容,为新合约向外部合约转账提供一个安全的方法。

好处:

  • 容易适用新的通证
  • 兼容 ERC-20
  • 为 ERC-20 设计的适配器用于安全使用 ERC-20

坏处:

  • 不是真正的新方法。只是一个 ERC-20 和 ERC-223 的折衷
  • 目前实现 尚未完成

重逢:ERC-777

ERC-777:一个先进的新通证标准,引入它是为了建立一个演进的通证标准,它是吸取了像带值的 approve() 以及上面提到的将通证发送到合约这样的错误观念的教训之后得来的演进后标准。

另外,ERC-777 使用了新标准 ERC-820:使用一个注册合约的伪内省,它允许为合约注册元数据以提供一个简单的内省类型。并考虑到了向后兼容和其它的功能扩展,这些取决于由一个 EIP-820 查找到的地址返回的 ITokenRecipient,和由目标合约实现的函数。

ERC-777 增加了许多使用 ERC-20 通证的经验,比如,白名单操作者、提供带 send(…) 的以太兼容的接口,为了向后兼容而使用 ERC-820 去覆盖和调整功能。

好处:

  • 从 ERC-20 的使用经验上得来的、经过深思熟虑的、进化的通证接口
  • 为内省要求 ERC-820 使用新标准,接受了增加的功能
  • 白名单操作者非常有用,而且比 approve/allowance 更有必要,它经常是无限的

坏处:

  • 刚刚才开始,复杂的依赖合约调用的结构
  • 依赖导致出现安全问题的可能性增加:第一个安全问题并不是在 ERC-777 中 确认(并解决的),而是在最新的 ERC-820 中

(纯主观的)结论(轻喷)

目前为止,如果你想遵循 “行业标准”,你只能选择 ERC-20。它获得了最广泛的理解与支持。但是,它还是有缺陷的,最大的一个缺陷是因为非专业用户设计和规范问题导致的用户真实地损失金钱的问题。ERC-223 是非常好的,并且在理论上找到了 ERC-20 中这个问题的答案了,它应该被考虑为 ERC-20 的一个很好的替代标准。在一个新通证中实现这两个接口并不复杂,并且可以降低燃料的使用。

ERC-677 是事件和金钱丢失问题的一个务实的解决方案,但是它并没能提供足够多的新方法,以促使它成为一个标准。但是它可能是 ERC-20 2.0 的一个很好的候选者。

ERC-777 是一个更先进的通证标准,它应该成为 ERC-20 的合法继任者,它提供了以太坊平台所需要的非常好的成熟概念,像白名单操作者,并允许以优雅的方式进行扩展。由于它的复杂性和对其它新标准的依赖,在主链上出现第一个 ERC-777 标准的通证还需要些时日。

链接

  1. 在 ERC-20 中使用 approve/transferFrom 模式的安全问题: https://drive.google.com/file/d/0ByMtMw2hul0EN3NCaVFHSFdxRzA/view
  2. ERC-20 中的无事件操作:https://docs.google.com/document/d/1Feh5sP6oQL1-1NHi-X1dbgT3ch2WdhbXRevDN681Jv4
  3. ERC-20 的故障及历史:https://github.com/ethereum/EIPs/issues/223#issuecomment-317979258
  4. ERC-20/223 的不同之处:https://ethereum.stackexchange.com/questions/17054/erc20-vs-erc223-list-of-differences

via: http://blockchainers.org/index.php/2018/02/08/token-erc-comparison-for-fungible-tokens/

作者:Alexander Culum 选题:lujun9972 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在共创协议下授权作品和挣钱这二者不再是一种争议。

传统观点认为,作家、摄影师、艺术家和其他创作者在 共创协议 Creative Commons 和其他开放许可下免费共享内容的不会得到报酬。这意味着大多数独立创作者无法通过在互联网上发布他们的作品来赚钱。而现在有了 LikeCoin:一个新的开源项目,旨在使这个让艺术家们经常为了贡献而不得不妥协或牺牲的常识成为过去。

LikeCoin 协议旨在通过创意内容获利,以便创作者可以专注于创造出色的内容而不是出售它。

该协议同样基于去中心化技术,它可以跟踪何时使用内容,并使用 LikeCoin 这种 以太坊 ERC-20 加密货币通证来奖励其创作者。它通过“ 创造性共识 Proof of Creativity ”算法进行操作,该算法一部分根据作品收到多少个“喜欢”,一部分根据有多少作品衍生自它而分配 LikeCoin。由于开放式授权的内容有更多机会被重复使用并获得 LikeCoin 令牌,因此系统鼓励内容创作者在 共创协议 Creative Commons 许可下发布。

如何运作的

当通过 LikeCoin 协议上传创意片段时,内容创作者也将包括作品的元数据,包括作者信息及其 InterPlanetary 关联数据(IPLD)。这些数据构成了衍生作品的家族图谱;我们称作品与其衍生品之间的关系为“内容足迹”。这种结构使得内容的继承树可以很容易地追溯到原始作品。

LikeCoin 通证会使用作品的衍生历史记录的信息来将其分发给创作者。由于所有创意作品都包含作者钱包的元数据,因此相应的 LikeCoin 份额可以通过算法计算并分发。

LikeCoin 可以通过两种方式获得奖励:要么由想要通过支付给内容创建者来表示赞赏的个人直接给予,或通过 Creators Pool 收集观众的“赞”的并根据内容的 LikeRank 分配 LikeCoin。基于在 LikeCoin 协议中的内容追踪,LikeRank 衡量作品重要性(或者我们在这个场景下定义的创造性)。一般来说,一副作品有越多的衍生作品,创意内容的创新就越多,内容就会有更高的 LikeRank。 LikeRank 是内容创新性的量化者。

如何参与?

LikeCoin 仍然非常新,我们期望在 2018 年晚些时候推出我们的第一个去中心化程序来奖励 共创协议 Creative Commons 的内容,并与更大的社区无缝连接。

LikeCoin 的大部分代码都可以在 LikeCoin GitHub 仓库中通过 GPL 3.0 许可证访问。由于它仍处于积极开发阶段,一些实验代码尚未公开,但我们会尽快完成。

我们欢迎功能请求、拉取请求、复刻和星标。请参与我们在 Github 上的开发,并加入我们在 Telegram 的讨论组。我们同样在 MediumFacebookTwitter 和我们的网站 like.co 发布关于我们进展的最新消息。


via: https://opensource.com/article/18/5/likecoin

作者:Kin Ko 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出