logo
back
back
Назад

Используя dApps , смарт-аккаунты и смарт-аcсеты , вы можете реализовать различные приложения с поддержкой блокчейна: игры и азартные игры, DeFi, цифровая идентификация, цепочки поставок и многое другое

Создать dAppdAppdApp

dApp — это учетная запись Waves, на которую назначен скрипт dApp, созданный для использования смарт-контрактов в WAVES. Скрипт dApp — это скрипт Ride, который содержит вызываемые функции, которые могут быть вызваны извне транзакциями Waves

Подробнее
gradient
img
img

Создайте свое первое DApp за один шаг в WAVES IDE

Скажите «Hello World» в сети WAVES

arrow
plus

Создайте свое первое децентрализованное приложение dApp

Step 1

Директивы

Каждый скрипт Ride должен начинаться с директив. Эти директивы сообщают компилятору, что:

< Скрипт использует стандартную библиотеку версии 6 >
< Тип скрипта dApp >
< Скрипт будет привязан к учетной записи >
ride
Копировать
1
2
3
{-# STDLIB_VERSION 6 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}

Вызываемые функции

Вызываемая функция может быть вызвана извне транзакцией invoke script

Результат вызываемой функции — это набор действий скрипта, которые выполняются в блокчейне

ride
Копировать
1
2
3
4
5
6
@Callable(i)
func helloWorld(name: String) = {
    [
        StringEntry("answer", "Hello World! Hello, " + name)
    ]
}

Добавьте скрипт в свой проект

Это намного проще, чем вы себе представляете. Скажите «Hello World» в сети WAVES Вставьте этот скрипт в свой проект

Новый проект IDE
ride
Копировать
1
2
3
4
5
6
7
8
9
{-# STDLIB_VERSION 6 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
@Callable(i)
func helloWorld(name: String) = {
    [
        StringEntry("answer", "Hello World! Hello, " + name)
    ]
}
arrow
plus

Развернуть

Step 2

deploy
deploy
deploy

Развертывание скрипта в сети Waves

deploy
deploy
deploy

Во время развертывания вам нужно будет создать свою учетную запись, если у вас ее еще нет

arrow
plus

Запустить тест

Step 3

// Запустить тест с помощью Surfboard

ride
Копировать
1
2
3
4
5
6
const WAVES = 10 ** 8;
const FEE = 0.001 * WAVES;
const ADD_FEE = 0.004 * WAVES;

describe('HelloWorld dApp test suite', async function () {
    this.timeout(100000);

// В предыдущем разделе мы выполняем все действия, необходимые для тестирования dApp, и генерируется определенное количество учетных записей с указанным балансом

ride
Копировать
1
2
3
4
before(async function () {
    await setupAccounts({
        dApp: 10 * WAVES,
    });

//Развертывание осуществляется транзакцией установки скрипта на аккаунт

ride
Копировать
1
2
3
4
5
const dAppScript = compile(file('dApp.ride'));
    const ssDAppTx = setScript({ script: dAppScript }, accounts.dApp);
    await broadcast(ssDAppTx);
    await waitForTx(ssDAppTx.id);
});

//Каждый раздел it() служит для проверки некоторой функциональности

ride
Копировать
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
it('Should say hello', async function () {
    const name = "Alex";

    const iInitTx = invokeScript({
        fee: FEE + ADD_FEE,
        dApp: address(accounts.dApp),
        call: {
            function: "helloWorld",
            args: [
                { type: 'string', value: name },
            ]
        },
    }, accounts.dApp);
    await broadcast(iInitTx);
    await waitForTx(iInitTx.id);

//Вызов функции скрипта осуществляется транзакцией invokeScript

ride
Копировать
1
2
3
4
const result = await accountDataByKey("answer", address(accounts.dApp))
        expect(result.value).to.be.equal("Hello World! Hello, " + name);
    });
})

//В конце мы считываем данные учетной записи по ключу и проверяем правильность сохраненных данных

ride
Копировать
1
2
3
4
const result = await accountDataByKey("answer", address(accounts.dApp))
        expect(result.value).to.be.equal("Hello World! Hello, " + name);
    });
})

Также вы можете запустить тест, используя транзакцию InvokeScript

//Пример вызова функции из dApp

java
Копировать
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import com.wavesplatform.crypto.Crypto;
import com.wavesplatform.transactions.InvokeScriptTransaction;
import com.wavesplatform.transactions.SetScriptTransaction;
import com.wavesplatform.transactions.TransferTransaction;
import com.wavesplatform.transactions.account.PrivateKey;
import com.wavesplatform.transactions.common.Amount;
import com.wavesplatform.transactions.common.Base64String;
import com.wavesplatform.transactions.data.DataEntry;
import com.wavesplatform.transactions.invocation.Function;
import com.wavesplatform.transactions.invocation.StringArg;
import com.wavesplatform.wavesj.Node;
import com.wavesplatform.wavesj.Profile;
import com.wavesplatform.wavesj.exceptions.NodeException;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.web3j.utils.Files;

import java.io.File;
import java.io.IOException;

public class DappTest {

    static PrivateKey dApp;

    static Node node;

    static Base64String dAppScript;

    // additional info can be found - https://hub.docker.com/r/wavesplatform/waves-private-node
    static PrivateKey faucet = PrivateKey.fromSeed("waves private node seed with waves tokens");

    // In "Before section", we perform all the actions that we need to test the dApp
    @BeforeClass
    public static void before() throws NodeException, IOException {
        node = new Node(Profile.LOCAL);

        // Certain number of accounts with the specified balance is generated
        dApp = PrivateKey.fromSeed(Crypto.getRandomSeedBytes());
        TransferTransaction transfer = TransferTransaction.builder(
            dApp.address(), Amount.of(1_00_000_000)
        ).getSignedWith(faucet);
        node.broadcast(transfer);
        node.waitForTransaction(transfer.id());

        // Deployment is carried out by the transaction of installing the script on the account
        String source = Files.readString(new File("src/test/resources/dApp.ride"));
        dAppScript = node.compileScript(source).script();
        SetScriptTransaction ssTx = SetScriptTransaction.builder(dAppScript).getSignedWith(dApp);
        node.broadcast(ssTx);
        node.waitForTransaction(ssTx.id());
    }

    @Test
    public void should_say_hello() throws NodeException, IOException {
        String name = "Alex";

        // Call of the script function is carried out by the invokeScript transaction
        InvokeScriptTransaction iInitTx = InvokeScriptTransaction.builder(
            dApp.address(),
            Function.as("helloWorld", StringArg.as(name))
        ).getSignedWith(dApp);
        node.broadcast(iInitTx);
        node.waitForTransaction(iInitTx.id());

        // At the end, some checks are usually made.
        // In this case, we read the account data by key and check the correctness of the saved data
        DataEntry result = node.getData(dApp.address(), "answer");
        Assert.assertEquals(result.valueAsObject(), "Hello World! Hello, " + name);
    }
}

Поздравляем!

Вы успешно создали свой первый dApp. Он был опубликован в сети Waves.

Остались вопросы?

Давайте

Оставаться на связиОставаться на связиОставаться на связи

Узнайте о новых инфраструктурных продуктах, библиотеках и новых решениях для упрощения работы с блокчейном