鏈下資產(chǎn)發(fā)行
發(fā)行數(shù)字資產(chǎn)是區(qū)塊鏈的一大應(yīng)用。同質(zhì)化的火幣發(fā)行目前大多數(shù)基于以太坊的ERC20協(xié)議,這種協(xié)議在創(chuàng)建智能合約時(shí),便規(guī)定了整個(gè)資產(chǎn)的數(shù)量。由于智能合約的公開透明和資產(chǎn)的上限約束,來取信用戶對(duì)資產(chǎn)本身以及未來價(jià)值的信任。
然而,在某些場景下,資產(chǎn)是由某些業(yè)務(wù)的官方機(jī)構(gòu)發(fā)行的,比如在線游戲內(nèi)的資產(chǎn),這些資產(chǎn)不必及時(shí)上鏈兌現(xiàn),可以鏈下發(fā)行,當(dāng)累積到一定程度時(shí)再同步到鏈上。這種場景類似于支付貨款時(shí),支付方提供支票,收款方隨后拿著支票到銀行兌現(xiàn)現(xiàn)金。那么,如何能夠保證鏈下發(fā)行的資產(chǎn)能在鏈上兌現(xiàn)呢?
資產(chǎn)發(fā)行一般需要指明接收方,金額,兌現(xiàn)期限等,用數(shù)據(jù)結(jié)構(gòu)表示如下:
struct IssuanceMessage {
address recipient;
uint amount;
uint issuanceBlock; // could also use time stamp
}
限定區(qū)塊序號(hào)和限定時(shí)間戳主要是用來限定在某個(gè)區(qū)塊或者某個(gè)時(shí)間戳以后,該消息才被視作有效消息,可以來領(lǐng)取資產(chǎn)。
為了防止重放,這里每次授權(quán)的amount變量實(shí)際上是累計(jì)的,系統(tǒng)始終維護(hù)一個(gè)授予每個(gè)人的鑄幣權(quán)的總量,而每次簽名,用戶得到的是當(dāng)前簽名的amount減去上一次授權(quán)的amount的差。由于這個(gè)值是個(gè)遞增值,用戶無法拿過去作廢的簽名來獲得資產(chǎn)發(fā)行權(quán)。
具體的資產(chǎn)兌付的偽碼如下:
contract OffchainIssuableToken is MintableToken {
mapping (address => uint) latestWithdrawBlock;
struct IssuanceMessage {
address recipient;
uint amount;
uint issuanceBlock;
}
function redeemPromisedTokens(bytes payload, uint8 v, bytes32 r, bytes32 s) public returns (bool) {
assert(verify(payload, v, r, s));
IssuanceMessage memory msg = parse(payload, v, r, s);
// Ensure user submits the latest message they have
// to prevent replay attacks:
assert(msg.issuanceBlock > latestWithdrawBlock[msg.sender]);
latestWithdrawBlock[msg.sender] = this.blockNumber;
mint(msg.recipient, msg.amount);
}
}
這里的parse函數(shù)并未詳細(xì)設(shè)計(jì),實(shí)際上需要驗(yàn)證payload和簽名信息的對(duì)應(yīng)關(guān)系,并且解析出地址,是否和合約的owner一致。
應(yīng)用場景
- AI公司獎(jiǎng)勵(lì)線上參與者提供訓(xùn)練模型,可以通過發(fā)行這種不需要立即上鏈的資產(chǎn)
- 基于對(duì)某個(gè)具體個(gè)人的信任,他也可以向其他人發(fā)行線下資產(chǎn),資產(chǎn)價(jià)值的波動(dòng)本身蘊(yùn)含在周圍的人對(duì)他的信任的基礎(chǔ)上。
- 眾籌項(xiàng)目,當(dāng)項(xiàng)目尚未完成,需要對(duì)參與眾籌的用戶提供一個(gè)購買憑據(jù)。
- 一些臨時(shí)的應(yīng)用場景,比如禮物卡
- 當(dāng)人們?cè)诰W(wǎng)絡(luò)較差的環(huán)境下工作時(shí),可以先在無網(wǎng)絡(luò)狀態(tài)下進(jìn)行簽名,等有網(wǎng)環(huán)境下再去兌現(xiàn)。
爭論
- 是否應(yīng)當(dāng)設(shè)置總量上限。
- 好處:接收資產(chǎn)方能基本確定自己的資產(chǎn)的價(jià)值(假設(shè)總估值不變),不會(huì)因?yàn)檫^度發(fā)行資產(chǎn)導(dǎo)致通貨膨脹
- 壞處:當(dāng)發(fā)行資產(chǎn)數(shù)量到達(dá)上限后,發(fā)行方繼續(xù)發(fā)行的有效資產(chǎn),將無法在合約里兌付。