美文网首页
Aleo TypeScript SDK的基本使用

Aleo TypeScript SDK的基本使用

作者: 一个脱离高级趣味的人 | 来源:发表于2023-10-26 17:43 被阅读0次

    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 上查看交易是否得到确认。

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

    相关文章

      网友评论

          本文标题:Aleo TypeScript SDK的基本使用

          本文链接:https://www.haomeiwen.com/subject/rztuidtx.html