主頁 > 區塊鏈 > Bitcoin Computer——原理簡述

Bitcoin Computer——原理簡述

2020-11-06 01:07:56 區塊鏈

Bitcoin Computer是位元幣上的二層智能合約解決方案,該方案用Javascript語言撰寫智能合約,合約的代碼和呼叫都放到區塊鏈上,在鏈下進行合約狀態的計算和校驗,

合約代碼

我們以一個計數器合約為例來分析Bitcoin Computer的運行原理和特點,基本代碼如下:

import Computer from 'bitcoin-computer';

(async () => {
  const computer = new Computer.default({
    seed: 'the mnemonic words',
    chain: 'BSV',
    network: 'testnet'
  });

  class Counter {
    constructor(n) {
      this.n = n
    }
    inc() {
      this.n += 1
    }
  }

  const counter = await computer.new(Counter, [2]);
  await counter.inc();
  console.log(counter);
})()
  1. 創建Computer實體,
    在BSV的測驗網路上創建一個Computer實體,Computer是Bitcoin Computer的系統庫,可以通過npm等包管理工具進行安裝,
  2. 定義Counter合約,
    實際上就是一個javascript類,該類的建構式中初始化了成員變數n的值,inc方法每被呼叫一次,成員變數n就會加1,實作了一個簡單的計數功能,
  3. 部署合約,
    通過computernew方法,將Counter合約部署到區塊鏈上,第二個引數是Counter類的建構式的引數串列,也就是說我們在鏈上部署了一個Counter合約,合約的變數n的初始值為2,同時回傳了一個鏈上合約變數counter
    javascript關鍵字await說明部署合約是需要與外部互動的,很顯然這一步需要通過網路將代碼寫入區塊鏈,
  4. 運行合約,
    呼叫inc方法運行合約,讓計數器加1,這里也用了關鍵字await,說明合約的執行也是需要與區塊鏈互動的,

合約的部署、運行和同步

通過console.log陳述句列印出來的運行結果如下:

Counter {
  n: 3,
  _id: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0',
  _rev: '1aab4b23834b0502c15db98433d7eb50e5440f2a64b4a2553a81b655ae6e2696:0',
  _rootId: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0'
}

看到這個結果,我們首先可以猜測出n表示合約中成員變數的值,初始值為2,做了一次inc操作后值加1,也就是3,與猜測一致,

合約部署

觀察_id欄位,看值的格式,我們猜這也許是個txid,那我們打開區塊瀏覽器查查看,發現該tx的第0個output腳本部分用ASCII解碼后內容如下:

Q!6{Yìk¥í1;;üa??UF"Q3`????′-?_ìQ?L?{"__cls":"class Counter {\n constructor(n) {\n this.n = n\n }\n inc() {\n this.n += 1\n }\n }","__index":{"obj":0},"__args":[2],"__func":"constructor"}u

其中把可讀字串部分單獨提出來并格式化后內容如下:

{
  "__cls":"class Counter {\n constructor(n) {\n this.n = n\n }\n inc() {\n this.n += 1\n }\n }",
  "__index":{"obj":0},
  "__args":[2],
  "__func":"constructor"
}

可以推測,這個JSON資料應該就是合約部署資料,合約的javascript代碼、初始化引數等都放到了鏈上,根據這個內容,就可以恢復出一個javascript語言的Counter類實體,

ASM格式的腳本如下:

1 03367b59cc6ba5cdb93b3bdc61c7018655462251b3608383c5a1b4adcf5f1bcc1f 1 OP_CHECKMULTISIG 
7b225f5f636c73223a22636c61737320436f756e746572207b5c6e20202020636f6e7374727563746f72286e29207b5c6e202020202020746869732e6e203d206e5c6e202020207d5c6e20202020696e632829207b5c6e202020202020746869732e6e202b3d20315c6e202020207d5c6e20207d222c225f5f696e646578223a7b226f626a223a307d2c225f5f61726773223a5b325d2c225f5f66756e63223a22636f6e7374727563746f72227d OP_DROP

腳本可以分兩個部分:

  1. OP_CHECKMULTISIG為止,是一個多重簽名模板,這個多簽模板中只有一個公鑰,是個1/1簽名,說明這個UTXO只能被該公鑰對應的私鑰花費,可見,合約的運行是有權限控制的,
  2. PUSH一段資料,然后再DROP掉,對比ASCII格式,我們知道這段資料實際上就是上面的合約部署資料,

同時,我們還可以發現0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0表示的是一個outpoint,:前面為txid,后面為output index,

合約運行

觀察_rev欄位,這也是個outpoint,通過區塊鏈查詢發現ASCII格式內容如下:

Q!6{Yìk¥í1;;üa??UF"Q3`????′-?_ìQ?0{"__index":{"obj":0},"__args":[],"__func":"inc"}u

剝去不可讀字符并格式化后內容如下:

{
  "__index":{"obj":0},
  "__args":[],
  "__func":"inc"
}

這部分記錄了合約運行時被呼叫的方法和引數,

ASM格式的腳本如下:

1 03367b59cc6ba5cdb93b3bdc61c7018655462251b3608383c5a1b4adcf5f1bcc1f 1 OP_CHECKMULTISIG 
7b225f5f696e646578223a7b226f626a223a307d2c225f5f61726773223a5b5d2c225f5f66756e63223a22696e63227d OP_DROP

不出所料,套路跟部署部分是一樣的,

同時,我們還發現_revtx的input之一就是_id,也就是部署合約的outpoint,很明顯,合約從部署到運行,新的狀態花費前一個狀態的output而形成的新output,形成了一條tx鏈,_id記錄合約的最初outpoint,也就是部署outpoint,_rev記錄最新狀態的outpoint,

合約同步

我們運行一個新的程式,看合約是如何在不同電腦之間實作同步的,

import Computer from 'bitcoin-computer';

(async () => {
  const computer = new Computer.default({
    seed: 'the same mnemonic words',
    chain: 'BSV',
    network: 'testnet'
  });

  const counter = await computer.sync('1aab4b23834b0502c15db98433d7eb50e5440f2a64b4a2553a81b655ae6e2696:0');
  console.log(counter);

  await counter.inc();
  console.log(counter);
})()

computer.sync函式通過網路從區塊鏈獲取部署和運行資料,引數就是合約最新的outpoint,sync運行完畢后獲得的counter變數為:

Counter {
  n: 3,
  _rev: '1aab4b23834b0502c15db98433d7eb50e5440f2a64b4a2553a81b655ae6e2696:0',
  _id: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0',
  _rootId: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0'
}

這與前面運行的結果是一樣的,我們可以推測整個sync程序大致是這樣的:

  1. 通過函式引數定位到合約最新outpoint,
  2. 回溯整個tx鏈直到合約部署,
  3. 下載整個合約部署和運行資料,并在本地運行,算出最新狀態,

接下來再運行一次合約,結果如下:

Counter {
  n: 4,
  _rev: '9407b32d7e5e701949a4b00accbd74f04c4fb651451904d77ec1a8ce56d334b4:0',
  _id: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0',
  _rootId: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0'
}

結果如我們所預期,

此時我突發奇想,假設我不同步到最新的合約狀態,而是同步到中間的狀態,然后就運行,會怎么樣呢?
我們復制一份同樣的代碼,因為最新的n值已經變成了4,而代碼中sync的引數是n值為3時的outpoint,所以我們同步的是一個中間狀態,
運行代碼,同步后的counter為

Counter {
  n: 3,
  _rev: '1aab4b23834b0502c15db98433d7eb50e5440f2a64b4a2553a81b655ae6e2696:0',
  _id: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0',
  _rootId: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0'
}

這一步跟我們的預期一樣,同步下來了合約的中間狀態,

然后來看看await counter.inc()的執行結果:

(node:85000) UnhandledPromiseRejectionWarning: Error:
        Communication Error
        message	Request failed with status code 400
        request	post https://api.whatsonchain.com/v1/bsv/test/tx/raw
        transaction	 {
......
}
        response	"Missing inputs"
......

運行失敗了,我用......忽略了一些細節,通過關鍵資訊Missing inputs我們可以知道,失敗原因是要花費的UTXO不存在,這就符合邏輯了,遷移狀態就需要花費該狀態對應的UTXO,但這是個中間狀態,output已經被花費過了,tx遭到礦工拒絕,

Bitcoin Computer用UTXO為模型,解決了合約執行的先后順序問題,

合約權限

在_合約同步_這一節可以觀察到這樣一個細節:合約部署和合約同步兩部分代碼,在創建computer實體時,用了相同的助記詞,如果我們用不同的助記詞,在進行合約的同步和運行時會怎么樣呢?接下來我們就試試,
把合約同步部分的代碼復制一份,改掉助記詞部分,sync引數改為合約最新的outpoint 9407b32d7e5e701949a4b00accbd74f04c4fb651451904d77ec1a8ce56d334b4:0,然后運行,
首先,合約的同步是正確的,同步下來的counter變數內容為:

Counter {
  n: 4,
  _rev: '9407b32d7e5e701949a4b00accbd74f04c4fb651451904d77ec1a8ce56d334b4:0',
  _id: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0',
  _rootId: '0a21910877dbfa8990eec667253f140089ea7834f3677f4cab4df3ae416cb379:0'
}

接下來合約執行await counter.inc()陳述句失敗,失敗資訊為

(node:26304) UnhandledPromiseRejectionWarning: Error:
        Communication Error
        message	Request failed with status code 400
        request	post https://api.whatsonchain.com/v1/bsv/test/tx/raw
        transaction	 {
......
}
        response	"16: mandatory-script-verify-flag-failed (Operation not valid with the current stack size)"
......

在_合約運行_小節里,我們知道合約的腳本是以多簽名為基礎的,不同的助記詞無法計算出相同的公私鑰對,因此無法解鎖記錄最新狀態的UTXO,所以會產生上述失敗,

是否可以讓多個私鑰運行同一個合約呢?可以的,Bitcoin Computer的合約里有一個關鍵成員變數_owers用于管理合約的權限,我們來看一個新的例子:

import Computer from 'bitcoin-computer';

(async () => {
  const computerA = new Computer.default({
    seed: 'the mnemonic words',
    chain: 'BSV',
    network: 'testnet'
  });

  const computerB = new Computer.default({
    seed: 'different mnemonic words',
    chain: 'BSV',
    network: 'testnet'
  });

  class Counter {
    constructor(n, pubKeys) {
      this.n = n;
      this._owners = pubKeys;
    }
    inc() {
      this.n += 1;
    }
  }

  const pubKeys = [computerA.db.wallet.getPublicKey().toString(), computerB.db.wallet.getPublicKey().toString()];
  const counter = await computerA.new(Counter, [0, pubKeys]);
  await counter.inc();
  console.log(counter);

  const syncCounter = await computerB.sync(counter._rev);
  await syncCounter.inc();
  console.log(syncCounter);
})();
  1. 我們用兩組不同的助記詞創建了兩個Computer實體computerAcomputerB,每個實體都有與對方不同的公私鑰對,
  2. 創建一個新的計數器合約,與之前的區別是在建構式中增加了一個引數pubKeys,該引數用來表示一組公鑰,同時該引數傳給了Bitcoin Computer系統預留的成員變數_owners
  3. 我們用computerA創建合約實體counter,并把computerAcomputerB的兩個公鑰都傳給了合約,其中.db.wallet是Computer中的組件,可以用來獲取助記詞對應的公鑰等資訊,
  4. 合約部署成功后,用computerAcounter運行一次inc方法,觀察結果,
  5. 然后再用computerB把計數器合約同步到syncCounter中,用syncCounter運行一次inc方法,觀察結果,

先看computerA運行inc方法后的結果:

Counter {
  n: 1,
  _owners: [
    '03367b59cc6ba5cdb93b3bdc61c7018655462251b3608383c5a1b4adcf5f1bcc1f',
    '02c9788a60264523ba77500e19a0b2626c9b09b25daa16cfee09b4e1135d610c90'
  ],
  _id: 'dfd0a1a6792ff3fddc9277d8d18577ce0285a0c549ee77ec3adb0c4e4decc531:0',
  _rev: '2b302ed6eb74d92b51ce1491e9cc108a0f594aaa451efde9822b4968bb6fc3a3:0',
  _rootId: 'dfd0a1a6792ff3fddc9277d8d18577ce0285a0c549ee77ec3adb0c4e4decc531:0'
}

首先說明合約執行成功,我們再通過區塊鏈來查看ASM格式的合約部署腳本

1 03367b59cc6ba5cdb93b3bdc61c7018655462251b3608383c5a1b4adcf5f1bcc1f 
02c9788a60264523ba77500e19a0b2626c9b09b25daa16cfee09b4e1135d610c90 2 OP_CHECKMULTISIG 
7b225f5f636c73223a22636c61737320436f756e746572207b5c6e20202020636f6e7374727563746f72286e2c207075624b65797329207b5c6e202020202020746869732e6e203d206e3b5c6e202020202020746869732e5f6f776e657273203d207075624b6579733b5c6e202020207d5c6e20202020696e632829207b5c6e202020202020746869732e6e202b3d20313b5c6e202020207d5c6e20207d222c225f5f696e646578223a7b226f626a223a307d2c225f5f61726773223a5b302c5b22303333363762353963633662613563646239336233626463363163373031383635353436323235316233363038333833633561316234616463663566316263633166222c22303263393738386136303236343532336261373735303065313961306232363236633962303962323564616131366366656530396234653131333564363130633930225d5d2c225f5f66756e63223a22636f6e7374727563746f72227d OP_DROP

發現多簽名中有兩個公鑰了,而不是之前我們看到的一個,這兩個公鑰就對應了合約中_owners中的兩個變數,說明Bitcoin Computer在部署時對_owners變數做了特殊處理,讓該變數里的所有公鑰都放入了多簽中,如果不設定該引數,則只會放入創建者computer實體的公鑰,
既然computerB的公鑰也在多簽里,那么我們就可以預測computerB的合約執行也會成功,

computerBsyncCounter執行inc方法結果如下

Counter {
  n: 2,
  _owners: [
    '03367b59cc6ba5cdb93b3bdc61c7018655462251b3608383c5a1b4adcf5f1bcc1f',
    '02c9788a60264523ba77500e19a0b2626c9b09b25daa16cfee09b4e1135d610c90'
  ],
  _rev: 'c6cfdc8dcbaa3b331641f21a26173227664d685b31ec366f4f246bbf28be07ba:0',
  _id: 'dfd0a1a6792ff3fddc9277d8d18577ce0285a0c549ee77ec3adb0c4e4decc531:0',
  _rootId: 'dfd0a1a6792ff3fddc9277d8d18577ce0285a0c549ee77ec3adb0c4e4decc531:0'
}

跟我們預想的一樣,用computerB也可以執行成功,

可見,Bitcoin Computer是通過多簽名的方式來讓多個擁有不同私鑰的用戶執行同一個合約,

總結

Bitcoin Computer巧妙地將javascript、區塊鏈、UTXO、多簽名等融合在一起,創造了一個開發友好的二層合約解決方案,如果想進一步了解,可以參考官方檔案,
以后將會繼續對Bitcoin Computer做進一步探討,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/203762.html

標籤:區塊鏈

上一篇:NGK打造超強社區共識

下一篇:postman系列之入門指南和常用技巧整理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more