Aleo TypeScript SDK的基本使用

1. 安裝

"@aleohq/sdk": "^0.6.5"   or  npm install @aleohq/sdk or yarn add @aleohq/sdk

2. 創(chuàng)建和導(dǎo)入賬戶

創(chuàng)建賬戶

import * as aleo from "@aleohq/sdk";

const account = new aleo.Account();

// Individual keys can then be accessed through the following methods
const privateKey = account.privateKey();
const viewKey = account.viewKey();
const address = account.address();

導(dǎo)入賬戶

import * as aleo from "@aleohq/sdk";

const account = new aleo.Account({ privateKey: 'YOUR PRIVATE KEY' });

const privateKey = account.privateKey();
const viewKey = account.viewKey();
const address = account.address();

注意 privateKey 換成自己的私鑰

執(zhí)行程序

本地執(zhí)行

import * as aleo from "@aleohq/sdk";

/// Create the source for the "hello world" program
const program = "program helloworld.aleo;\n\nfunction hello:\n    input r0 as u32.public;\n    input r1 as u32.private;\n    add r0 r1 into r2;\n    output r2 as u32.private;\n";
const programManager = new aleo.ProgramManager();

/// Create a temporary account for the execution of the program
const account = new aleo.Account();
programManager.setAccount(account);

/// Get the response and ensure that the program executed correctly
const executionResponse = await programManager.executeOffline(program, "hello", ["5u32", "5u32"]);
const result = executionResponse.getOutputs();
console.log(`result = ${result}`);

這里需要注意一下:

Aleo 智能合約是用 Leo 語言編寫的秤涩,智能合約文件以 .leo 結(jié)尾饼暑, 比如 helloword.leo糟趾。我們通過 leo build 或者 leo run 命令將 helloword.leo 文件編譯成 helloword.aleo 文件(leo build 命令從 Leo v1.9.0 版本之后已經(jīng)廢棄),這里我們代碼中 program 變量賦的值就是 helloword.aleo 的代碼驯嘱。

這里在本地調(diào)用了 helloworld.aleo 合約的 hello 方法,預(yù)期的結(jié)果 result = 10u32喳坠。

網(wǎng)絡(luò)執(zhí)行

這里我們要將把智能合約部署到測試網(wǎng)之后鞠评,嘗試調(diào)用合約的方法。這里我們會用到官方提供的 Token 合約代碼壕鹉,使用里面 build 目錄下的 main.aleo 來部署

const account = new aleo.Account({ privateKey: "YOUR PRIVATE KEY" });

    // Create a key provider that will be used to find public proving & verifying keys for Aleo programs
    const keyProvider = new aleo.AleoKeyProvider();
    keyProvider.useCache = true;

    // Create a record provider that will be used to find records and transaction data for Aleo programs
    const networkClient = new aleo.AleoNetworkClient("https://vm.aleo.org/api");
    const recordProvider = new aleo.NetworkRecordProvider(account, networkClient);

    // Initialize a program manager to talk to the Aleo network with the configured key and record providers
    const programManager = new aleo.ProgramManager("https://vm.aleo.org/api", keyProvider, recordProvider);
    programManager.setAccount(account);

    // Define an Aleo program to deploy
    const program = `program token_v2023.aleo;

    record token:
        owner as address.private;
        amount as u64.private;
    
    
    mapping account:
      key as address.public;
      value as u64.public;
    
    function mint_public:
        input r0 as address.public;
        input r1 as u64.public;
        async mint_public r0 r1 into r2;    output r2 as token_v2023.aleo/mint_public.future;
    
    finalize mint_public:
        input r0 as address.public;
        input r1 as u64.public;
        get.or_use account[r0] 0u64 into r2;
        add r2 r1 into r3;
        set r3 into account[r0];
    
    
    function mint_private:
        input r0 as address.private;
        input r1 as u64.private;
        cast r0 r1 into r2 as token.record;
        output r2 as token.record;
    
    
    function transfer_public:
        input r0 as address.public;
        input r1 as u64.public;
        async transfer_public self.caller r0 r1 into r2;    output r2 as token_v2023.aleo/transfer_public.future;
    
    finalize transfer_public:
        input r0 as address.public;
        input r1 as address.public;
        input r2 as u64.public;
        get.or_use account[r0] 0u64 into r3;
        sub r3 r2 into r4;
        set r4 into account[r0];
        get.or_use account[r1] 0u64 into r5;
        add r5 r2 into r6;
        set r6 into account[r1];
    
    
    function transfer_private:
        input r0 as token.record;
        input r1 as address.private;
        input r2 as u64.private;
        sub r0.amount r2 into r3;
        cast r0.owner r3 into r4 as token.record;
        cast r1 r2 into r5 as token.record;
        output r4 as token.record;
        output r5 as token.record;
    
    
    function transfer_private_to_public:
        input r0 as token.record;
        input r1 as address.public;
        input r2 as u64.public;
        sub r0.amount r2 into r3;
        cast r0.owner r3 into r4 as token.record;
        async transfer_private_to_public r1 r2 into r5;    output r4 as token.record;
        output r5 as token_v2023.aleo/transfer_private_to_public.future;
    
    finalize transfer_private_to_public:
        input r0 as address.public;
        input r1 as u64.public;
        get.or_use account[r0] 0u64 into r2;
        add r2 r1 into r3;
        set r3 into account[r0];
    
    
    function transfer_public_to_private:
        input r0 as address.public;
        input r1 as u64.public;
        cast r0 r1 into r2 as token.record;
        async transfer_public_to_private self.caller r1 into r3;    output r2 as token.record;
        output r3 as token_v2023.aleo/transfer_public_to_private.future;
    
    finalize transfer_public_to_private:
        input r0 as address.public;
        input r1 as u64.public;
        get.or_use account[r0] 0u64 into r2;
        sub r2 r1 into r3;
        set r3 into account[r0];
    `;

    // Define a fee to pay to deploy the program
    const fee = 6.656;

    // Deploy the program to the Aleo network
    const txId = await programManager.deploy(program, fee);
    console.log(`txId = ${txId}`);

    // Verify the transaction was successful
    const transaction = await programManager.networkClient.getTransaction(txId);
    console.log(`tx = ${transaction}`);

privateKey 換成自己的私鑰并且保證里面要足夠的積分作為部署合約的費用剃幌;

注意程序的名字聋涨,長度不要太短,越短部署的時候需要支付的費用越高负乡,長度10及以上不需要額外支付費用牍白。

@aleohq/sdk: ^0.6.2 部署的時候會報 Error("Error fetching program") 的錯誤,這是 sdkbug 抖棘, 需要等待后期修復(fù)茂腥。

合約部署完成之后就可以開始調(diào)用合約的方法, 這里我們調(diào)用合約的 mint_public 方法給指定地址發(fā)送 token

  const account = new aleo.Account({ privateKey: "YOUR PRIVATE KEY" });

  // Create a key provider that will be used to find public proving & verifying keys for Aleo programs
  const keyProvider = new aleo.AleoKeyProvider();
  keyProvider.useCache = true;

  // Create a record provider that will be used to find records and transaction data for Aleo programs
  const networkClient = new aleo.AleoNetworkClient("https://vm.aleo.org/api");
  const recordProvider = new aleo.NetworkRecordProvider(account, networkClient);

  // Initialize a program manager to talk to the Aleo network with the configured key and record providers
  const programManager = new aleo.ProgramManager("https://vm.aleo.org/api", keyProvider, recordProvider);
  programManager.setAccount(account);

  const programName = "token_v2023.aleo";
  const functionName = "mint_public";
  const inputs = ["aleo10aju84jkxnvuw47qanfffnnzphwujsc803cqt6g237dq9a785qxq7zsqhf", "5000000u64"];

  const txId = await programManager.execute(programName, functionName, 0.13835, false, inputs, undefined, undefined, undefined, undefined, undefined, undefined);
  console.log(`txId = ${txId}`);

方法執(zhí)行完成之后我們可以看到輸出的 txId, 之后可以在 explorer 上查看交易是否得到確認(rèn)切省。

以上內(nèi)容包含了賬戶的創(chuàng)建和導(dǎo)入最岗,程序的部署和執(zhí)行,后面將介紹交易費用的獲取朝捆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末般渡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子右蹦,更是在濱河造成了極大的恐慌诊杆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何陆,死亡現(xiàn)場離奇詭異晨汹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贷盲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門淘这,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巩剖,你說我怎么就攤上這事铝穷。” “怎么了佳魔?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵曙聂,是天一觀的道長。 經(jīng)常有香客問我鞠鲜,道長宁脊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任贤姆,我火速辦了婚禮榆苞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霞捡。我一直安慰自己坐漏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赊琳,像睡著了一般街夭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慨畸,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天莱坎,我揣著相機(jī)與錄音,去河邊找鬼寸士。 笑死檐什,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弱卡。 我是一名探鬼主播乃正,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼婶博!你這毒婦竟也來了瓮具?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凡人,失蹤者是張志新(化名)和其女友劉穎名党,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挠轴,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡传睹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岸晦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欧啤。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖启上,靈堂內(nèi)的尸體忽然破棺而出邢隧,到底是詐尸還是另有隱情,我是刑警寧澤冈在,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布倒慧,位于F島的核電站,受9級特大地震影響包券,放射性物質(zhì)發(fā)生泄漏纫谅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一兴使、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧照激,春花似錦发魄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汰寓。三九已至,卻和暖如春苹粟,著一層夾襖步出監(jiān)牢的瞬間有滑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工嵌削, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留毛好,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓苛秕,卻偏偏與公主長得像肌访,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子艇劫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容