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
命令從 Leov1.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")
的錯誤,這是sdk
的bug
抖棘, 需要等待后期修復(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í)行,后面將介紹交易費用的獲取朝捆。