溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

move語言怎么用

發(fā)布時(shí)間:2022-01-15 10:48:27 來源:億速云 閱讀:179 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“move語言怎么用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“move語言怎么用”吧!

move語言的特點(diǎn)

Libra的目標(biāo)是打造一個(gè)全球話的金融和貨幣的平臺,從而賦能地球上的幾十億人。那么作為Libra的move語言就需要在安全性和可編程性上面提供大力的支持。

為了實(shí)現(xiàn)這樣的目標(biāo),move遵從如下四大設(shè)計(jì)原則:

資源優(yōu)先

在區(qū)塊鏈中我們需要通過程序來存取數(shù)字資產(chǎn),這個(gè)數(shù)字資產(chǎn)和普通程序中的變量(如booleans,integers,strings)有著明顯的區(qū)別。我們需要一個(gè)特別的方式來表示區(qū)塊鏈中的數(shù)字資產(chǎn)。

Move語言中的resource就是特別為數(shù)字資產(chǎn)定義的,它有這樣的特點(diǎn):

resource是不能被拷貝和隱式銷毀的,它只能在不同的用戶之間移動(dòng)。這個(gè)特性是在Move的類型定義中已經(jīng)聲明了的。除了這個(gè)特殊的限制,resource和其他普通的資源一樣,可以存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)中,可以作為參數(shù)傳給過程等。

資源優(yōu)先的概念為程序員寫出安全和有效的代碼提供了非常大的幫助。

Libra coin就是一種resource,因?yàn)樗鼘⒑同F(xiàn)實(shí)世界的貨幣相對應(yīng),所以它可以被創(chuàng)建,修改,或者銷毀。我們需要做的就是通過modules來控制好操作coin的權(quán)限。

move中的modules有點(diǎn)像以太坊中的智能合約,module聲明了resource類型和過程(業(yè)務(wù)邏輯:如何創(chuàng)建,移動(dòng),銷毀coin)。module中的定義的type和過程可以被其他的module進(jìn)行調(diào)用。

靈活性

move的靈活性體現(xiàn)在可以通過transaction腳本來自由組合各種transaction來實(shí)現(xiàn)不同的功能,一個(gè)腳本可以調(diào)用多個(gè)transaction,

在move中modules/resources/procedures的關(guān)系有點(diǎn)像面向?qū)ο蟪绦蛘Z言中classes/objects/methods的關(guān)系。

安全性

move定義了資源的安全性,類型的安全性和內(nèi)存的安全性,任何違背這些安全性的操作都會(huì)被拒絕。

一般來說,有兩種方式來實(shí)現(xiàn)這個(gè)功能:1.在高級別的語言定義上,通過編譯器來檢查這些異常。 2. 在低級別的虛擬機(jī)匯編語言上檢查這些異常。

move是這兩種方式中間的一種方式:Move執(zhí)行的字節(jié)碼比匯編語言要高級一點(diǎn),但是又比編程語言又低級一點(diǎn)。move的字節(jié)碼提交到鏈上后,會(huì)被字節(jié)碼驗(yàn)證器校驗(yàn),然后經(jīng)由字節(jié)碼解釋器執(zhí)行。

可驗(yàn)證性

最好的驗(yàn)證方式就是將字節(jié)碼提交到鏈上進(jìn)行真實(shí)的驗(yàn)證,但這樣很明顯會(huì)加重鏈的負(fù)擔(dān),影響交易的速度,所以在move中我們盡可能多的在鏈上做輕量級的驗(yàn)證,而在語言級別做線下的靜態(tài)驗(yàn)證。

Move語句初探

本節(jié)我們會(huì)通過一個(gè)例子來詳細(xì)的講解Move語言的具體特性。本節(jié)的例子是使用move IR來編寫的,這是一個(gè)實(shí)驗(yàn)性的版本,正式的move語言還在編寫中。

點(diǎn)對點(diǎn)支付交易腳本

public main(payee: address, amount: u64) {
let coin: 0x0.Currency.Coin = 0x0.Currency.withdraw_from_sender(copy(amount));
0x0.Currency.deposit(copy(payee), move(coin));
}

上面是一段簡單的交易腳本,main方法有兩個(gè)輸入,一個(gè)是地址,一個(gè)是要支付的數(shù)目。

邏輯其實(shí)很簡單,從發(fā)送者的賬戶里面減去amount, 然后將它轉(zhuǎn)給接收者。

0x0是module的存儲(chǔ)地址,Currency是module的名字,0x0.Currency.Coin 代表的就是資源了。

在上面的章節(jié)中我們講到了,coin是resource,只能move不能copy,嘗試將move(coin)替換成copy(coin)會(huì)報(bào)錯(cuò)。

其他的非resource的資源像是payee和amout可以被move也可以被copy.

如果我們添加這樣一行:

0x0.Currency.deposit(copy(some_other_payee), move(coin))

則coin將會(huì)被使用兩次,這在邏輯上是有問題的,在Move語言中,

move(coin)方法在使用一次過后會(huì)變得不可用,從而導(dǎo)致第二次move失敗,從而有效的保障了應(yīng)用邏輯。

coin只能也必須移動(dòng)一次,如果把move(coin)刪除,同樣會(huì)的到一個(gè)錯(cuò)誤。這樣做的目的是有效的避免程序員的疏忽導(dǎo)致的應(yīng)用邏輯錯(cuò)誤。

Currency Module

上面我們定義了一個(gè)Currency的module。這里我們講一下Currency是怎么實(shí)現(xiàn)的。

Libra有兩種程序,一種是transaction腳本,一種是module,腳本會(huì)去調(diào)用module里面的過程來更新全局狀態(tài)。

transaction腳本是一種只能執(zhí)行一次的腳本,執(zhí)行完之后就不能再用了,而module是發(fā)布在全局狀態(tài)里面的長期存在的代碼。

全局狀態(tài)是一個(gè)賬戶地址到賬戶的映射,如下圖所示,0x0,0x1,0x2都是賬戶的地址。

move語言怎么用

每個(gè)地址里面可以包含任意個(gè)module和資源。例如0x0地址的賬戶包含了一個(gè)module:0x0.Currency和一個(gè)resource:0x0.Currency.Coin.

知道了賬戶的結(jié)構(gòu)之后,我們看下module是怎么定義資源的:

module Currency {resource Coin { value: u64 }// ...}

上面的代碼定義了一個(gè)Coin的resource,它有一個(gè)value字段,類型是u64。

接下來我們看下存儲(chǔ)這個(gè)操作是怎么定義的:

public deposit(payee: address, to_deposit: Coin) {let to_deposit_value: u64 = Unpack<Coin>(move(to_deposit));let coin_ref: &mut Coin = BorrowGlobal<Coin>(move(payee));let coin_value_ref: &mut u64 = &mut move(coin_ref).value;let coin_value: u64 = *move(coin_value_ref);*move(coin_value_ref) = move(coin_value) + move(to_deposit_value);}

這個(gè)過程主要做了這樣幾件事情:

  1. 銷毀輸入的Coin,并且記錄下它的值。

  2. 獲取存在payee中的Coin的reference。

  3. 把輸入的Coin加到payee上。

Unpack<T> 是唯一的銷毀T的方式,unpack會(huì)銷毀T,然后返回T對應(yīng)的值。

BorrowGlobal<T> 接收一個(gè)地址作為參數(shù),然后返回一個(gè)指向該地址里的T實(shí)例的引用。

同樣的,我們看下withdraw_from_sender 是怎么實(shí)現(xiàn)的:

public withdraw_from_sender(amount: u64): Coin {let transaction_sender_address: address = GetTxnSenderAddress();let coin_ref: &mut Coin = BorrowGlobal<Coin>(move(transaction_sender_address));let coin_value_ref: &mut u64 = &mut move(coin_ref).value;let coin_value: u64 = *move(coin_value_ref);RejectUnless(copy(coin_value) >= copy(amount));*move(coin_value_ref) = move(coin_value) - copy(amount);let new_coin: Coin = Pack<Coin>(move(amount));return move(new_coin);}

這個(gè)過程做了這樣3件事情:

  1. 獲得發(fā)送者地址里面coin的唯一引用。

  2. 減去相應(yīng)的數(shù)量。

  3. 創(chuàng)建并返回一個(gè)新的coin。

其中Pack<T>是Unpack<T>的反向操作。用來創(chuàng)建T資源。

到此,相信大家對“move語言怎么用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI