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
命令从 Leov1.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")
的错误,这是sdk
的bug
, 需要等待后期修复。
合约部署完成之后就可以开始调用合约的方法, 这里我们调用合约的 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 上查看交易是否得到确认。
以上内容包含了账户的创建和导入,程序的部署和执行,后面将介绍交易费用的获取。