环境:
J3455+2G+DS3167xs

自己配置过 Web Station,因为时间的关系,没办法继续折腾。无意中看到有使用 Docker 来实现 DDNS 的方案。刚好到时候折腾系统的时候已经安装好了。按照教程进行简单的设置,直接成功了。Perfect!!!

步骤:

打开 Docker 套件,切换到 注册表,在右侧搜索框中输入 ali 回车搜索并找到 chenhw2/aliyun-ddns-cli,下载。
编辑环境变量“AKID”和“AKSCT”为在阿里的访问控制中申请的APPID和APPScret,“DOMAIN”为当前阿里云账号下的任意域名,也可以是子域名,请填写完整域名,如:dns.xxx.com。“REDO”是配置解析更新频率,按需填写。
启动 Docker 容器。登录阿里查看解析是否成功。不成功,请检查环境变量设置。

原文:http://gjx.8800.org:8088/index.php/post/75.html

docker 镜像:https://github.com/chenhw2/aliyun-ddns-cli

场景:
用户中心对接钱包,安装Geth钱包提供RPC接口供后台使用,通过RPC接口为每个用户生成了钱包地址,且保存了钱包密码。

需求:
需要将用户充值进来的ETH或基于ERC20的代币归集(归总)转出到线下冷钱包。

步骤:

  1. var tokenContract = eth.contract('abi');
  2. var balance = tokenContract.at('contract').balanceOf('address');
  3. if (balance == 0) return;
  4. personal.unlockAccount(eth.accounts[0])
  5. eth.sendTransaction({from:eth.accounts[0],to:'address',value:'feeAmount', data:web3.toHex('fee')});
  6. personal.unlockAccount('address')
  7. var token = tokenContract.at('contract');
  8. token.approve(eth.accounts[0], 'num');
  9. token.transferFrom('address', 'cool wallet', 'num')

只是列出了大概思路,详细说明见:https://waphe.com/index.php/archives/ERC20-contract.html

扫码添加我的微信或QQ一起讨论更优化文案。

由以太坊代幣(Token)的標準 — ERC20 Token來介紹代幣的撰寫及使用方式,和其周邊的附加功能。

原文:https://medium.com/taipei-ethereum-meetup/erc20-token%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8A-3d7871c58bea

ERC20

ERC20 Token的EIP約在兩年前就已經提出,經過歷時長久的社群討論,在九月的時候確定了最終版本。

以下是一個標準的ERC20合約所需要具備的函式及行為:

代幣的全名

function name() constant returns (string name)
回傳代幣的全名,例如 OutrichTrumpICOToken。注意,此函式目的為增加可讀性,非必要,使用者或合約請勿指望此函式一定會有回傳值。

代幣的縮寫

function symbol() constant returns (string symbol)
回傳代幣的縮寫,例如 OTICO,縮寫並無規定一定要為三個字元。同樣請勿指望此函式一定會有回傳值。

代幣的最小單位

function decimals() constant returns (uint8 decimals)
回傳使用者看到的最小單位,為一個數值,表示此代幣最多可細分到小數點後幾位數。例如假設數值為3,表示最後使用者看到的擁有代幣數量會是像這樣123.456。看代幣的用途,對應到現實世界中或現有的資產各會有不同的最小單位。沒特別需求可對應到以太幣的單位,設為18。同樣請勿指望此函式一定會有回傳值。

代幣的總量

function totalSupply() constant returns (uint256 totalSupply)
回傳代幣的發行總量。

查詢某帳戶的代幣餘額

function balanceOf(address _owner) constant returns (uint256 balance)
參數為欲查詢的帳戶地址,回傳值為一正整數。注意,代幣餘額皆會是正整數,要搭配 decimals函式來顯示單位給使用者。

移轉代幣給他人

function transfer(address _to, uint256 _value) returns (bool success)
參數1為接收代幣的地址,參數2為數量,回傳值為布林值 — 1表示成功,0表示失敗。

  1. 若成功移轉代幣,則一定要觸發Transfer event(見下一點)。如果送出代幣者的餘額不足,則應該要觸發throw,復原一切更動。
  2. 若是因為產生新代幣而呼叫此函式,則應該要將Transfer事件的_from設為0x0,表示為新產生的代幣。
  3. 若移轉代幣數量為零,仍視為正常的代幣移轉並照常觸發Transfer事件。

移轉代幣觸發事件

event Transfer(address indexed _from, address indexed _to, uint256 _value)
參數1為送出代幣的地址,參數2為接受代幣的地址,參數3為代幣的數量。

從A移轉代幣給B

function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
參數1為送出代幣的地址,參數2為接受代幣的地址,參數3為數量。回傳值為布林值 — 1表示成功,0表示失敗。

  1. 如果沒有送出代幣者的授權(見下一點)或餘額不足,則應該要觸發throw,復原一切更動。若成功移轉代幣,則一定要觸發Transfer event。
  2. 若移轉代幣數量為零,仍視為正常的代幣移轉並照常觸發Transfer事件。

批准自己的代幣移轉

function approve(address _spender, uint256 _value) returns (bool success)
參數1為可以領走自己代幣的對象的地址,參數2為數量,回傳值為布林值 — 1表示成功,0表示失敗。透過呼叫這個函式來批准某對象可以藉由transferFrom函式領走自己最多_value數量的代幣。

  1. _value是自訂的,可以設為超過自己的餘額的值。
  2. 批准並不代表將代幣鎖住直到對方領走為止,使用者仍可在對方領走之前先領走代幣,這樣對方在呼叫函式時會因為餘額不足而失敗。若成功批准,則一定要觸發Approval事件。
  3. 為了避免Front Running而導致Double Spend的攻擊,使用者在更改一個批准的數量時,應該要先送出一個數量為零的批准再進行正常的批准。

A批准給B的代幣數量(必要)

function allowance(address _owner, address _spender) constant returns (uint256 remaining)
參數1為代幣擁有者的地址,參數2為可以領走代幣的地址,回傳值為一正整數。

代幣批准觸發事件(必要)

event Approval(address indexed _owner, address indexed _spender, uint256 _value)
參數1為代幣擁有者的地址,參數2為可以領走代幣的地址,參數3為代幣的數量。
transferFrom及approve兩個函式為一個組合,目的是提供用領取的方式來轉移代幣(相對於使用送出方式的transfer)。會使用領取模式是因為如果代幣接收方是一個合約,則在發生transfer時合約不會收到通知,即合約沒辦法知道代幣轉到它身上。

也因為這個原因,讓某些應用場景無法實現。例如一個合約C的某個功能需要收取某代幣才能執行,如果合約沒辦法知道transfer到底發生了沒,就沒辦法知道代幣是否成功移轉給它,也就沒辦法繼續執行它的功能。如果改用領取模式 — 使用者在使用合約C的功能前先批准一定量的代幣給C,合約C執行的時候用transferFrom領取代幣 ,領取成功就繼續執行它的功能,否則退出執行 — 這讓合約接受代幣做為報酬的方式得以實現。

路印协议 - LRC

路印协议新一代区块链资产交易协议和交易所。它采用去中心化技术,提供零风险的代币交易所模式,并允许多家交易所通过竞争,对同样的订单进行链外撮合及链上清结算。

https://loopring.io/#/

0x协议 - ZRX

0x是一个点对点交易的开源协议,以促进以太坊区块链中ERC20代币的交易。该协议旨在作为开放标准和通用构建模块,推动包括交易所功能的去中心化应用(DApps)之间的互操作性。交易由以太坊智能合约系统执行,可以公开访问,免费使用,且任何DApp都可以接入。 建立在协议之上的DApps可以访问公共流动资金池或创建自己的流动资金池,并对其交易量收取交易费用。该协议不会把成本强加于用户之上,也不会任意地从一组用户中获取价值来惠及其他用户。去中心化管理用于将更新以持续而安全的方式集成到基本协议中,而不会中断更高级别的进程。

https://www.0xproject.com/

KyberNetwork - KNC
KyberNetwork,它是一个具备高流动性的数字资产(如各类加密代币)以及加密数字货币(例如以太坊、比特币和 ZCash)即时交易和兑换的链上协议。

https://kyber.network/

原文:https://busy.org/@chaimyu/3c72ac-gusd

ERC20 token在转移时都需要有以太币做为燃料费,GUSD也是ERC20代币,但GUSD提供了一种不需要以太币进行资金归集的方法,简单来看一看。

授权资金归集

function enableSweep(uint8[] _vs, bytes32[] _rs, bytes32[] _ss, address _to) public onlySweeper {
    require(_to != address(0));
    require((_vs.length == _rs.length) && (_vs.length == _ss.length));

    uint256 numSignatures = _vs.length;
    uint256 sweptBalance = 0;

    for (uint256 i=0; i<numSignatures; ++i) {
      address from = ecrecover(sweepMsg, _vs[i], _rs[i], _ss[i]);

      // ecrecover returns 0 on malformed input
      if (from != address(0)) {
        sweptSet[from] = true;

        uint256 fromBalance = erc20Store.balances(from);

        if (fromBalance > 0) {
          sweptBalance += fromBalance;

          erc20Store.setBalance(from, 0);

          erc20Proxy.emitTransfer(from, _to, fromBalance);
        }
      }
    }

    if (sweptBalance > 0) {
      erc20Store.addBalance(_to, sweptBalance);
    }
}

如果要允许地址余额被归集,需要用这个地址对合约中变量“sweepMsg”进行签名,把签名数据给Sweeper。

Sweeper用签名后的数据调用enableSweep()函数,波函数中会通过“ecrecover”验证签名数据,验证通过则把这个地址放入可归集地址中(sweptSet[from]),同时将地址余额转移到函数参数“_to”指定的地址。

可以看出,只要签名同意过Sweeper进行资金归集,这个授权就是永久的,Sweeper有权将地址余额转移到任何地址。

重新归集

function replaySweep(address[] _froms, address _to) public onlySweeper {
    require(_to != address(0));
    uint256 lenFroms = _froms.length;
    uint256 sweptBalance = 0;

    for (uint256 i=0; i<lenFroms; ++i) {
        address from = _froms[i];

        if (sweptSet[from]) {
            uint256 fromBalance = erc20Store.balances(from);

            if (fromBalance > 0) {
                sweptBalance += fromBalance;

                erc20Store.setBalance(from, 0);

                erc20Proxy.emitTransfer(from, _to, fromBalance);
            }
        }
    }

    if (sweptBalance > 0) {
        erc20Store.addBalance(_to, sweptBalance);
    }
}

这个函数比较简单,Sweeper可以调用这个函数,传入一堆地址,如果这些地址是授权可以被归集的,则将地址余额转移到函数参数“_to”指定的地址中。

结论

GUSD通过一次签名永久授权的方式,提供了一种 ERC20 代币资金归集的方法,可以借鉴。

遗憾的是只能自己写的 ERC20 合约才可以这样做,已经发布的 ERC20 代币进行资金归集还是需要以太币的,不知道 ERC 新标准里有没有类似的方法。