木星链 木星链
Ctrl+D收藏木星链

TOK:Libra硬刚微信、支付宝?教你如何在Libra上发布金融资产

作者:

时间:1900/1/1 0:00:00

本月17日,当Marcus被问到Libra未来是否会成为支付宝、微信的竞争对手时,Marcus对此表示了默认,“是的,议员。”但无论Libra未来的命运如何,也无论Libra将如何与微信、支付宝竞争,焦点都会回归到金融资产发行的问题上,那如何用代码实现?今天,营长手把手教你如何基于ERC20标准在Libra上发布金融资产。本文是「Libra编程」系列文章的第3篇,也是最后一篇。在之前的两篇文章,我们分别探讨了Libra项目的技术意义以及LibraClient与Validator内部处理与执行交易。Part1:被Libra刷屏的你绝对不知道,也许这才是它最大的"核武器"...Part2:关于Libra币交易,你需要了解的一切...Libra作为法币稳定币,成为一个金融系统还需要具有债券股票以及各种证券资产与衍生品,本文将从技术角度入手,使用ERC20标准在Libra区块链上发布金融资产。主要分为以下两部分:编写tokenmoudule编译、部署tokenmoudule希望这个教程可以让你对Libra的技术细节有更深刻的了解。编写tokenmoudule如何使用MoveIR编写一个简单的tokenmodule?为方便理解,我们选择Ethereum的ERC20token作为范例,分别执行mint、balanceOf和transfer三个功能。开始前,我们需要了解Libra与以太坊在处理resource的逻辑方面有什么不同。与Ethereumglobalstate不同的是,Libra并不设置统一集中存储的globalresource,而是将resource分散在各个账户存放。因此,以太坊智能合约撰写"addressstorageowner=0x"这类变量需要用不同的逻辑来实现。每个人拥有多少token也分别存放在各自账户的resource下,而不是采用"mapping(address=>uint256)"这样的统一存储方式处理。1、Capability

目前Libra开发团队推荐的处理globalvariable的方式是使用一个singletonpattern的module来进行模拟。因此,我们将事件拥有所有者的(owner)权限定义为一种只能被发布一次的resource,比如"resourceT{}"。针对这个T进行的操作有两个方法,一是在初始化时执行"grant()"用来确保TokenCapability被移交给所有者;而"borrow_sender_capability()"则是检查操作者是否拥有所有者的权限。1moduleTokenCapability{2resourceT{}3//GrantTokenCapabilitytotheowner4publicgrant(){}5//ReturnanimmutablereferencetotheTokenCapabilityofthesenderifitexists.Thiswillonlysucceedifthetransactionsenderistheowner.6publicborrow_sender_capability():&mutR#Self.T{}7}grant()如何执行"grant()"?首先,我们需要定义两个角色,调用这个函数的交易发起者与实际上的所有者owner。很可惜的是目前MoveIR并没有提供类似"Self.published_address"的方式来让我们获得发布该module的账户,因此我们只能在代码中写死module所有者的地址,代码如下:1//GrantTokenCapabilitytotheowner2publicgrant(){3letsender:address;4letowner:address;5lett:R#Self.T;67sender=get_txn_sender();89owner=0x1234;10//假设0x1234是所有者的地址11assert(move(sender)==move(owner),77);12//检查交易发起者是否为所有者1314t=T{};15//为所有者建立新的TokenCapability16move_to_sender<T>(move(t));17//将TokenCapability.T转移给所有者。18return;19}从上面的代码中我们可以发现,只有通过"sender==owner"检查才能取得所有者的resourceT,因此我们可以确保resourceT只会被所有者所拥有,其他的账户都没有机会获得这个resourceT。此外,"move_to_sender<structuretype>(resource)"是MoveIR提供的内建函数,它代表了将resource移交给交易发起者的账户。Borrow_sender_capability()如何检查并确认交易发起者拥有所有者的resource?借助MoveIR提供的辅助函数"borrow_global<structuretype>(resourceaccount)"处理。borrow_global会去该账户下面调取出resource,如果该账户下没有持有这个resource则会触发意外情况,交易也会失败。若成功则会返回可变的resourcereference。1//如果存在,则返回对交易发起者的TokenCapability的不可变引用。2//只有在交易发起者是所有者才会执行成功。3publicborrow_sender_capability():&mutR#Self.T{4letsender:address;5lett_ref:&mutR#Self.T;67sender=get_txn_sender();8t_ref=borrow_global<T>(move(sender));910returnmove(t_ref);11}2、Token

Bison Trails CEO:Libra协会目前正忙于代币发布和其他后端准备工作:Libra协会创始成员Bison Trails的首席执行官Joe Lallouz最近表示:“Libra与其他更广泛的区块链、加密货币的使命并没有太大的不同。这个领域中的每个人都在试图解决一个非常相似的问题,那就是我们如何创造一个更公平、更开放、更透明的生态系统。”Lallouz还提到,Libra协会目前正忙于代币发布和其他后端准备工作。(AMBCrypto)[2020/3/16]

Libra的权限管理方式比较特别,上文已着重介绍,接下来撰写Tokenmodule!1moduleToken{23importTransaction.TokenCapability;45//Tokenresource,代表一个账户的总余额.6resourceT{7value:u64,8}910//建立一个新的Token.T,value值为011publiczero():R#Self.T{12returnT{value:0};13}1415//返回Token的值16publicvalue(token_ref:&R#Self.T):u64{17return*&move(token_ref).value;18}1920//为交易发起者发布初始余额为0的Token21publicpublish(){}2223//`mint_to_address`只能由所有者调用.24//这会给收款人一个新的Token,价值是amount25publicmint_to_address(payee:address,amount:u64){}2627//Mint一个新的Token,价值是`value`.28mint(value:u64,capability:&mutR#TokenCapability.T):R#Self.T{}29//返回Token余额`account`.30publicbalanceOf(account:address):u64{}3132//返回交易发起者的Token余额.33publicbalance():u64{}3435//将`to_deposit`的token存入the`payee`\\'s账户36publicdeposit(payee:address,to_deposit:R#Self.T){}37publicwithdraw(to_withdraw:&mutR#Self.T,amount:u64):R#Self.T{}38//将Token从交易发起者转到收款人39publictransfer(payee:address,amount:u64){}40}TokenResource整个Tokenmodule的结构如上。定义这个Token的resourceT{value:u64}代表了未来每个账户将会持有多少数量(T.value)的token,也要定义两个跟T相关的辅助函数zero()制作一个数量为零的Token.T,value()回传该Token.T的实际数值。Publish如同Capability一样,每个账户都是分别持有自己的resource。Libra的设计逻辑中并不允许在没经过某账户的同意下为其增加额外的resource,不像以太坊中只要有地址就可以收到别人的转账。因此,我们需要一个辅助函数供Token的所有者调用,为他们建立Token.T的resource。这是Publish负责的事情。1//为交易发起者publish一个初始余额为0的token23publicpublish(){4lett:R#Self.T;5//建立一个新的数值为0的Token.T6t=Self.zero();7//将Token.T转移到交易发起者的账户下8move_to_sender<T>(move(t));9return;10}Minting让账户拥有resourceToken.T的下一步便是发送一些token,因此接下来将具体解释mint功能如何实现!1publicmint_to_address(payee:address,amount:u64){2letcapability_ref:&mutR#TokenCapability.T;3letmint_token:R#Self.T;45//使用TokenCapability来确保只有所有者有权限可以增发token6capability_ref=TokenCapability.borrow_sender_capability();78//呼叫下方的mint()来建立数量为amount的Token.T9mint_token=Self.mint(copy(amount),move(capability_ref));1011//将mint出来的Token.T合并到收款人的名下,这个函数我们在下面解释。12Self.deposit(move(payee),move(mint_token));13return;14}1516mint(amount:u64,capability:&mutR#TokenCapability.T):R#Self.T{17//为确保只有交易发起者拥有TokenCapability.T,直接发布resource即可。18release(move(capability));1920//建立一个有amount数量的Token.T21returnT{value:move(amount。;22}增发token时,我们应先确保sender有增发的权限,如果没有这个权限,transaction便会失效;然后建立要增发给payee的Token.T,最后通过Token.deposit函数将新建的Token.T与payeeaccount下的resourceToken.T合并。Balance增发token后,还缺乏查询名下Token数量的方法,这就需要撰写balance了!1publicbalanceOf(account:address):u64{2lettoken_ref:&mutR#Self.T;3lettoken_const_ref:&R#Self.T;4lettoken_val:u64;56//从该账户下取得resourcereference7token_ref=borrow_global<T>(move(account));89//因为我们没有计划改动resource的数值,因此把可变的reference冻结,改成不可变的reference10token_const_ref=freeze(move(token_ref));1112//调用value()来取得实际的余额13token_val=Self.value(move(token_const_ref));14returnmove(token_val);15}161718//这个balance()是直接包装balanceOf(),提供交易发起者一个简单的接口可以查询。19publicbalance():u64{20letsender:address;21letbalance_val:u64;22sender=get_txn_sender();23balance_val=Self.balanceOf(move(sender));24returnmove(balance_val);25}转账Transfer重头戏当然是转账,transfer一共分为三个步骤:从交易发起者借用resourceToken.T;将交易发起者的resourceToken.T分割成要转账的部分与余额(由withdraw函数负责);将交易发起者转账的部分与付款人的resourceToken.T合并(deposit函数负责)。因此整个transfer函数如下:1publictransfer(payee:address,amount:u64){2letto_pay:&mutR#Self.T;3letsender:address;4letto_withdraw:R#Self.T;56sender=get_txn_sender();78//借用交易发起者的resourceToken.T9to_pay=borrow_global<T>(move(sender));1011//分割出要给收款人的部分12to_withdraw=Self.withdraw(move(to_pay),move(amount));1314//将要给收款人的部分与收款人账户下原有的Token.T合并15Self.deposit(move(payee),move(to_withdraw));1617return;18}而Withdraw与Deposit实现如下:1publicdeposit(payee:address,to_deposit:R#Self.T){2letdeposit_value:u64;3letpayee_token_ref:&mutR#Self.T;4letpayee_token_const_ref:&R#Self.T;5letpayee_token_value:u64;67//取出要合并的数值8T{value:deposit_value}=move(to_deposit);910//获得付款人的Token.Treference与现有的数值11payee_token_ref=borrow_global<T>(move(payee));12payee_token_const_ref=freeze(copy(payee_token_ref));13payee_token_value=Self.value(move(payee_token_const_ref));1415//修改付款人的Token.T的数值16*(&mutmove(payee_token_ref).value)=move(payee_token_value)+17move(deposit_value);18return;19}2021publicwithdraw(to_withdraw:&mutR#Self.T,amount:u64):R#Self.T{22letvalue:u64;2324//取得交易发起者的Token.T数量,并确认是否足够支付这次转账25value=*(&mutcopy(to_withdraw).value);26assert(copy(value)>=copy(amount),10);2728//修改交易发起者的Token.T数量,并将分割后的Token.T转出去29*(&mutmove(to_withdraw).value)=move(value)-copy(amount);30returnT{value:move(amount。;31}测试module

声音 | Facebook区块链主管:Libra可成为一种协议帮助资金流动 将使数十亿人获益:Facebook区块链主管David Marcus今日发文《为什么建立一个新的金钱协议是真正改变人们游戏方式的唯一途径》称,Libra项目将使来自世界各地的钱包、商家和服务能以令人难以置信的低成本进行价值转移。这将是一种近乎实时的结算方式,甚至不需要考虑世界各地银行为各种货币所准备的流动性池。Libra可以成为一种“协议”,使资金能够快速、廉价、稳定地在全球服务提供商、机构和人员之间流动,并能通过消除非常多的中介以及复杂性操作和开销,从而大大降低成本。Libra将使数十亿人们更容易获得现代数字货币和金融服务。[2019/9/26]

一个mvir的档案含有两个区块,分别是modules与script,在modules中会撰写交易中需要部署的所有modules,script是在这次交易中我们想执行的程序。TestScript在我们的范例中,通过使用交易script的区块来进行测试。在这个测试中,我们把交易发起者作为所有者,并且mint1314个token给交易发起者,最后检查交易发起者的余额是否跟mint的数值:1314一致。1script:2importTransaction.TokenCapability;3importTransaction.Token;4main(){5letsender:address;6letbalance_val:u64;7letsender_balance:u64;8sender=get_txn_sender();910//Grantowner\\'scapability11TokenCapability.grant();1213//PublishanTokenaccount14Token.publish();1516//Mint1314tokenstotheowner17Token.mint_to_address(copy(sender),1314);1819//Checkbalance==131420balance_val=Token.balanceOf(copy(sender));21assert(copy(balance_val)==1314,2);22sender_balance=Token.balance();23assert(move(sender_balance)==move(balance_val),1);24return;25}测试在撰写完modules与script后,依据Libra团队的建议,需将档案放入"language/functional_tests/tests/testsuite/modules/"下,并执行"cargotest-pfunctional_tests<filename>",Libra就会加载并将执行刚才所撰写的合约,结果如下图:编译、部署到localtestnet

声音 | 朱民:Libra可能会颠覆全球货币政策和金融稳定:清华大学国家金融研究院院长、国际货币基金组织原副总裁朱民今日发表了《天秤币Libra可能带来的颠覆》文章,朱民在文章中表示天秤币Libra天然具有银行加资本市场的金融属性,可以承担直接融资和间接融资的金融功能。 天秤币Libra本身也是一种证券,是由传统资产抵押产生的凭证。一旦天秤币Libra开始使用,就会自然通过交叉产品销售进入细分市场,只要交易用天秤币Libra定价,天秤币Libra就会自动进入贸易融资,消费信贷,存款吸收,支付发起, 资产管理等各种金融业务。从天秤币Libra的金融属性看,它可以嫁接的金融业务包括存贷款、证券发行、数字资产发行、去中心化资产交易、激活第三类边缘资产交易等。从而形成一个线上线下,银行、股市、债市加金融衍生产品的几乎无所不包的新金融生态。天秤币Libra也由此几乎集央行和商业银行于一身,同时具有直接发行货币和信用扩张的能力。[2019/9/23]

如今Libratestnet尚未开放直接部署modules,只能通过建立自己的localtestnet来进行测试。现在部署的工具还在非常早期的阶段,对开发者的使用上也不是十分友好,以下是整理后的部署流程。1、编译Libra后,可以在"targe/debug/"资料夹下找到compiler和transaciton_builder两个工具;2、通过使用compiler将撰写的mvir编译成program,"./target/debug/compiler-o<output_file_name><input.mvir>";3、通过transaction_builder把sender,program、argument等封装成rawtransaction,"./target/debug/transaction_builder<sender_address><sequence_number><path_to_program_file><output_transaction_file_name>--args";4、最后进到libracli中使用submit<sender_address/sender_account_ref><path_to_transaction_file>对Libracli发出交易。注:我们也编写了几笔交易的scripts用来操作Token请参考此链接:https://github.com/second-state/libra-research/tree/master/examples/ERC20Token/transaction_scripts部署与使用Token的顺序1、先将token.mvir(含有Token、TokenCapability的module)部署到Libra;2、要想使用该token账户,必须先调用init.mvir将Token.T发布到账户的resource中;3、所有者可通过mint.mvir给其他拥有resourceToken.T的账户增发token;4、两个拥有resourceToken.T的account可以通过transfer.mvir进行token转移。开启允许部署modules的权限

声音 | Coinbase安全主管:Libra仍处于开发阶段 谈论影响为时尚早:Coinbase安全主管Philip Martin表示,目前最大的挑战是向客户解释安全性基本原理,使之记住密码并保证密钥安全。此外,Martin还对Facebook数字货币项目Libra给予厚望,不过他表示,现在判断Libra能否扩大对整个加密货币行业安全性的影响还为时过早,并解释说,Libra有可能将加密货币带给数十亿人,但我认为,尽管存在潜力,但现在谈论Libra,协议和货币的技术影响还为时尚早,因为它仍处于开发阶段。[2019/8/19]

Libra在编译时期(compilation-time)时从genesisfile里面读取是否可以设定部署modules的权限。因此,为把modules部署到localtestnet,我们需要在编译前修改这项设定。在"language/vm/vm_genesis/genesis/vm_config.toml"这个档案,只需将""中的"type=Locked"改为"type=Open"即可。更改完以后,一定要重新编译使设定生效。参考链接:1、SingletonPatternCapability:https://community.libra.org/t/any-notion-of-global-variables/355/22、TokenCapability:https://github.com/second-state/libra-research/blob/master/examples/ERC20Token/token.mvir#L33、TokenSourceCode:https://github.com/second-state/libra-research/tree/master/examples/ERC20Token

声音 | HTC去中心化部门负责人:Libra或成为美国未来对Facebook进行反垄断调查的主要焦点:据WND报道,手机制造商HTC去中心化部门负责人Phil Che认为,Facebook的举动是一次“危险”的权力攫取,其威胁甚至超过了隐私担忧。他认为,全球货币Libra是“迄今为止他们设计的最具侵略性和最危险的监控形式”。 他预测这将成为美国联邦政府即将对Facebook进行的反垄断调查的主要焦点。“如果在全球范围内推出和采用,我们一定会把Facebook视为未来100年内最大的10家公司之一,这些公司完全拥有客户和其数据,从他们的社交图到通过Facebook、WhatsApp和Instagram记录的每笔交易。”他指的是Facebook旗下的两家主要数字媒体公司,这个项目是比特币的对立面,也是向完全控制数据和用户迈出的又一步。[2019/6/19]

标签:TOKKENTOKENTOKEuGAS-JUN21 Token Expiring 30 Jun 2021Waterfall Governance TokenDegen Token FinanceMandi Token

比特币行情热门资讯
比特币:星球日报 | Legder比特币期货因CFTC遭搁浅;英国银行宣布接受加密企业开法币账户

头条LedgerX否认比特币期货合约的推出因CFTC搁浅传闻LedgerX推出实物结算比特币期货合约的消息昨日曝光,但目前尚不清楚该产品是否已上线。LedgerX已经删除了关于该产品发布的推文.

1900/1/1 0:00:00
区块链:深度剖析IEO:平均盈利7.6倍 哪家收益高?

编者按:本文来自PANews,文字及数据:Carol,编辑:Tong,设计:Tina,星球日报经授权发布.

1900/1/1 0:00:00
比特币:星球行情观察团 | 顶级分析师告诉你,大盘接下来往哪里走?

仔细观察市场变化的投资者会发现,6月份以来,整个数字货币市场的投资生态正在经历类似“A股港股化”的演变,“大浪淘沙,剩者为王”将是未来的主基调.

1900/1/1 0:00:00
WEB:Web 3.0是什么?

编者按:本文来自区块律动BlockBeats,作者:0x2,Odaily星球日报经授权转载。当你在家里看《长安十二时辰》的时候,隔壁老王家的某云矿机正在不断地为你传输下一集的视频文件;你为了看这.

1900/1/1 0:00:00
区块链:区块链游戏:机会在哪里?

编者按:本文来自蓝狐笔记,作者:Zanehuffman,翻译:SL,Odaily星球日报经授权发布.

1900/1/1 0:00:00
区块链:星球日报| 阿里巴巴申请区块链新专利;2019年全球区块链投资支出将达27亿美元

头条阿里巴巴在美国申请区块链系统跨链交互域名管理方案专利阿里巴巴在美国申请一项名为“区块链系统跨链交互域名管理方案”的专利。8月15日,阿里巴巴提交了最新的申请,延续了2018年11月的申请.

1900/1/1 0:00:00