Aleo TypeScript SDK的基本使用

1. 安装

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

2. 创建和导入账户

创建账户

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();

导入账户

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 换成自己的私钥

执行程序

本地执行

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 结尾, 比如 helloword.leo。我们通过 leo build 或者 leo run 命令将 helloword.leo 文件编译成 helloword.aleo 文件(leo build 命令从 Leo v1.9.0 版本之后已经废弃),这里我们代码中 program 变量赋的值就是 helloword.aleo 的代码。

这里在本地调用了 helloworld.aleo 合约的 hello 方法,预期的结果 result = 10u32

网络执行

这里我们要将把智能合约部署到测试网之后,尝试调用合约的方法。这里我们会用到官方提供的 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 , 需要等待后期修复。

合约部署完成之后就可以开始调用合约的方法, 这里我们调用合约的 mint_public 方法给指定地址发送 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}`);

方法执行完成之后我们可以看到输出的 txId, 之后可以在 explorer 上查看交易是否得到确认。

以上内容包含了账户的创建和导入,程序的部署和执行,后面将介绍交易费用的获取。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容