DAOrayakiDAO研究奖金池:
资助地址:?DAOrayaki
Struct&Abilities
struct?Counter?has?key,?store?{????value:u64,}
使用struct定义了一个叫做Counter的结构体,同时被key,store两种限制符修饰。
Move的类型系统灵活,每种类型都可以定义四种能力。
它们定义了类型的值是否可以被复制、丢弃和存储。
这四种abilities限制符分别是:Copy,Drop,Store和Key。
它们的功能分别是:
Copy?-值可以被复制。
Drop?-在作用域结束时值可以被丢弃。
Key?-值可以作为键值被「全局存储操作」进行访问。
Store?-值可以被?存储?到全局状态。
这里用key、store修饰,则表示它不能被复制,也不能被丢弃或重新使用,但是它却可以被安全地存储和转移。
Abilities的语法
基本类型和内建类型的abilities是预先定义好的并且不可改变:integers,vector,addresses和boolean类型的值先天具有copy、drop和storeability。
然而,结构体的ability可以按照下面的语法进行添加:
struct?NAME?has?ABILITY??{??}
一个简单的图书馆例子:
HyperDAO 对于Hyperdao超级算力(交易宝)信息声明:据官方消息,HyperDAO团队申明,对于有关Hyperdao超级算力(交易宝)已获得多家机构风险投资新闻内容与HyperDAO去中心化社区自治平台无关,两者并没有任何关联。 HyperDAO目前已经成功进行跨链桥搭建至MATIC L2 和 BSC链。近期HyperDAO也和Dropgen达成合作,将送出10个NFT给10位幸运会员,更多相关资讯请留意HyperDAO官方的最新消息。[2021/11/3 6:29:37]
module?Library?{????//?each?ability?has?matching?keyword????//?multiple?abilities?are?listed?with?comma????struct?Book?has?store,?copy,?drop?{????????year:?u64????}????//?single?ability?is?also?possible????struct?Storage?has?key?{????????books:?vector????}????//?this?one?has?no?abilities????struct?Empty?{}}
什么是Resource
Move白皮书中详细描述了Resource这个概念。最初,它是作为一种名为resource的结构体类型被实现,自从引入ability以后,它被实现成拥有?Key和?Store两种ability的结构体。Resource可以安全的表示数字资产,它不能被复制,也不能被丢弃或重新使用,但是它却可以被安全地存储和转移。
MakerDAO发起新增三个Vault类型的治理投票:金色财经报道,据官方博客消息,MakerDAO治理促进者已代表Oracle域团队发布治理投票,以将SLP-DAI-ETH、 SLP-USDC-ETH以及SLP-WBTC-ETH添加为新的Vault类型。[2021/6/1 23:00:01]
Resource的定义
Resource是一种用?key?和?store?ability限制了的结构体:
module?M?{????struct?T?has?key,?store?{????????field:?u8????}}Resource的限制
在代码中,Resource类型有几个主要限制:
Resource存储在帐户下。因此,只有在分配帐户后才会存在,并且只能通过该帐户访问。
一个帐户同一时刻只能容纳一个某类型的Resource。
Resource不能被复制;与它对应的是一种特殊的kind:resource,它与copyable不同,这一点在泛型章节中已经介绍。
Resource必需被使用,这意味着必须将新创建的Resource?move到某个帐户下,从帐户移出的Resource必须被解构或存储在另一个帐户下。
刚才的案例
struct?Counter?has?key,?store?{????value:u64,}
所以这里就有一个和solidity的区别了,在eth上如果需要发行一个新资产,比如usdc。那这个资产是记录在合约里的某个map中。而move就不同了,资产是作为resource存在用户地址下的。
Matataki DAO治理模块上线Quadratic Voting功能:个人社交代币社区Matataki DAO治理模块上线Quadratic Voting功能,任何绑定了第三方社交网络账号的Fan票发行者和用户,均可创建基于平方投票的提案,持有相应Fan票的用户在投票时,权重为其所投票数额取平方根。[2020/11/12 14:09:07]
定义函数
public?fun?init(account:?&signer){????move_to(account,?Counter{value:0});}public?fun?incr(account:?&signer)?acquires?Counter?{????let?counter?=?borrow_global_mut(signer::address_of(account));????counter
public?entry?fun?init_counter(account:?signer){????Self::init(&account。public?entry?fun?incr_counter(account:?signer)??acquires?Counter?{????Self::incr(&account。
定义格式则是:
public?fun?函数名(参数:参数类型){?}
move函数默认是私有函数,只能在定义它们的模块中访问。关键字public将更改函数的默认可见性并使其公开,即可以从外部访问。
init方法参数是一个&signer,意味着该方法必须是一个账户合法签名过后才可以调用,move_to则是move的一个原语,作用是发布、添加Counter资源到signer的地址下。Move的账户模型,code和data是存储在一个账户地址下的。
MakerDAO发起投票计划提高ETH债务上限至2.6亿美元:据官方消息,7月27日晚间,MakerDAO已将新的执行投票纳入投票系统。该执行投票计划将ETH-A债务上限从2.2亿美元提高到2.6亿美元。此外,执行投票还包括每月治理周期捆绑建议的批准与否。每月治理周期捆绑建议包括:1.MIP16,每周治理周期;2.MIP18,元参数调整;3.MIP19,清算系统1.1升级等内容。[2020/7/28]
下面是列举的常用原语
move_to<T>(&signer,T):发布、添加类型为T的?Resource?到signer的地址下。
move_from<T>(addr:address):T-从地址下删除类型为T的?Resource?并返回这个资源。
borrow_global<T>(addr:address):&T-返回地址下类型为T的?Resource?的不可变引用。
borrow_global_mut<T>(addr:address):&mutT-返回地址下类型为T的?Resource?的可变引用。
exists<T>(address):bool:判断地址下是否有类型为T的?Resource。
incr方法参数也是一个&signer,意味着该方法必须是一个账户合法签名过后才可以调用,
关键字?acquires,放在函数返回值之后,用来显式定义此函数获取的所有Resource。
Signer::address_of(account)从签名者中拿到address
动态 | MakerDAO治理合约升级新版本,潜在威胁已排除:05月07日,区块链安全公司PeckShield独立研究发现,MakerDAO的旧治理合约存在安全漏洞,一旦被利用,会导致用户投票的MKR代币被合约锁死。具体而言:由于该治理合约实现的投票机制(vote(bytes32))存在某种缺陷,允许投票给还不存在的slate(但包含有正在投票的提案)。等用户投票后,攻击者可以恶意调用free()退出,达到减掉有效提案的合法票数,并同时锁死投票人的MKR代币。次日,PeckShield紧急和Maker公司同步漏洞细节。05月10日凌晨,MakerDAO公开了新版合约。Zeppelin和PeckShield也各自独立完成了对其新合约的审计,确定新版本修复了该漏洞。截止目前,旧治理合约中尚有2,463个MKR代币(价值约128万美元)未完成转移。PeckShield在此提醒,DeFi类合约管理着大量的金融资产,其合约安全性关系到每一个投资用户,DeFi项目方应务必做好合约安全审计,避免因造成不必要的数字资产损失。[2019/5/10]
borrow_global_mut上面有介绍到,可变借用到address下的resourceCounter,然后将Counter结构体下的value进行1操作。
这下面的两个方法则是script方法,它与上面两个函数有什么区别呢?
publicfun:方法可以在任何模块中被调用。
public(script)fun/publicentryfun:scriptfunction是模块中的入口方法,表示该方法可以通过控制台发起一个交易来调用,就像本地执行脚本一样
下个版本的Move会用publicentryfun替代public(script)fun
Self则是代表自身module。
使用AptosCli编译、部署、调用合约
#?创建新的测试环境aptos?init?--profile?devtest?--rest-url??--faucet-url?#?编译move合约aptos?move?compile?--package-dir?my-counter#?部署合约#?例如:aptos?move?publish?--package-dir?my-counter?--named-addresses?basecoin=0x8e00bd9827faf171996ef37f006dd622bb5c3e43ec52298a8f37fd38cd59664?--profile?devtestaptos?move?publish?--package-dir?my-counter?--named-addresses?basecoin=?--profile?devtest#?调用合约#?例如:#?aptos?move?run?--function-id?0x8e00bd9827faf171996ef37f006dd622bb5c3e43ec52298a8f37fd38cd59664::MyCounter::init_counter?--profile?devtest#?aptos?move?run?--function-id?0x8e00bd9827faf171996ef37f006dd622bb5c3e43ec52298a8f37fd38cd59664::MyCounter::incr_counter?--profile?devtestaptos?move?run?--function-id?::::?--profile?devtest#?列出指定账户的modules/resources信息aptos?account?list?--query?modules?--account?0xa1285adb4b8abedf5faf7a46d260c5844f1f64d59dd9b8869db1543cf5bbadf4?--profile?devtestaptos?account?list?--query?resources?--account?0x4200c2b801870f20a709abba80b6edb90a45ecd9b8acce9842b93d597602edcf?--profile?devtest
AptosSDK调用Move合约
编译好合约之后,我们可以通过sdk调用我们的合约。
我们可以选择通过sdk部署合约,也可以通过sdk调用move合约。
通过sdk部署合约
当我们编译完成之后,会在move合约文件夹下生成?build/?文件夹
我们需要把?my-counter/build/Examples/bytecode_modules/MyCounter
通过SDK发送交易
这里,我们以my-counter合约中的init_counter?和?incr_counter?为例。
构造两个方法用于调用这两个方法,从而实现客户端调用?init?和?incr?的功能。
async?function?initCounter(contractAddress:?string,?accountFrom:?AptosAccount):?Promise?{??const?scriptFunctionPayload?=?new?TxnBuilderTypes
async?function?incrCounter(contractAddress:?string,?accountFrom:?AptosAccount):?Promise?{??const?scriptFunctionPayload?=?new?TxnBuilderTypes
通过?SDK?获取账户里的资源信息。
resource是存放在所属的账户地址下的,我们可以根据account地址,查询相关的resource信息。
getCounter()方法其实就是获取?my-counter?下的**Counter**资源。
async?function?getCounter(contractAddress:?string,?accountAddress:?MaybeHexString):?Promise?{??try?{????const?resource?=?await?client
执行效果
执行成功,在这里通过SDK,给一个随机生成的账户init了Counter资源,然后incr了三次,所以最后Counter的Value为?3。
image-20220831200516865
my-counter相关代码:https://github.com/99Kies/Aptos-Move-Dapp
参考资料
UsingCLItoRunaLocalTestnet|AptosDocs:?https://aptos.dev/nodes/local-testnet/using-cli-to-run-a-local-testnet
源码:?https://github.com/aptos-labs/aptos-core/blob/main/aptos-move/framework/move-stdlib/sources/signer.move
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。