-
Notifications
You must be signed in to change notification settings - Fork 2
Beam SDK Tutorial (in progress)
Anatol Sevastsyan edited this page Nov 2, 2021
·
6 revisions
- git
- cmake >= 3.13
- python >= 3.4
- ninja
- clone shader-sdk repository:
git clone https://github.com/BeamMW/shader-sdk.git- init shader-sdk with
initcommand:
cd shader-sdk
./shade init On Windows
cd shader-sdk shade init
- go to the directory you want to generate a new project
cd <project-root>- create new contract with
create_projectcommand:
python shader-sdk/scripts/manager.py create_project HelloWorld --newdiryou can omit
--newdirflag, in this case the project will be generated right into yourProjectRootdirectory
- jump into your new contract's directory:
cd HelloWorld- open contract.h with your favourite text editor or IDE:
nvim shaders/contract.hOn Windows you can simply call context menu on your project folder and choose
Open with Visual Studio. Project folder has generatedCMakeSettings.jsonfile and it allows to compile contract and app shaders right from Visual Studio usingwasm32-Releaseconfiguration.
- add structure with params for contract's Method_2:
diff --git a/shaders/contract.h b/shaders/contract.h
index 89c926e..100c36e 100644
--- a/shaders/contract.h
+++ b/shaders/contract.h
@@ -5,11 +5,20 @@
namespace HelloWorld {
#include "contract_sid.i"
+ constexpr size_t MSG_MAXSIZE = 256;
+
#pragma pack(push, 1)
struct InitialParams {
static const uint32_t METHOD = 0;
};
+ struct SendMsgParams {
+ static const uint32_t METHOD = 2;
+
+ char msg[MSG_MAXSIZE];
+ PubKey user;
+ };
+
#pragma pack(pop)
}
-
save and close
contract.h: -
open
contract.cppwith your favorite text editor:
nvim shaders/contract.cpp- write Method_2:
diff --git a/shaders/contract.cpp b/shaders/contract.cpp
index ae11ee1..e80c870 100644
--- a/shaders/contract.cpp
+++ b/shaders/contract.cpp
@@ -13,7 +13,7 @@ BEAM_EXPORT void Dtor(void*)
Env::DelVar_T(0);
}
-BEAM_EXPORT void Method_2(void*)
+BEAM_EXPORT void Method_2(const HelloWorld::SendMsgParams& params)
{
-
+ Env::SaveVar_T(params.user, params.msg);
}
-
save and close
contract.cpp -
open
app.cppwith your favorite text editor
nvim shaders/app.cpp- add 2 actions: send_msg, get_my_msg
diff --git a/shaders/app.cpp b/shaders/app.cpp
index 3414d9f..501e769 100644
--- a/shaders/app.cpp
+++ b/shaders/app.cpp
@@ -59,6 +59,30 @@ void On_action_view_contract_params(const ContractID& cid)
Env::DocGroup gr("params");
}
+void On_action_send_msg(const ContractID& cid)
+{
+ HelloWorld::SendMsgParams params;
+
+ Env::DocGetText("msg", params.msg, sizeof(params.msg));
+ Env::DerivePk(params.user, &cid, sizeof(cid));
+
+ Env::GenerateKernel(&cid, HelloWorld::SendMsgParams::METHOD, ¶ms, sizeof(params), nullptr, 0, nullptr, 0, "Sending msg to contract", 0);
+}
+
+void On_action_get_my_msg(const ContractID& cid)
+{
+ Env::Key_T<PubKey> key;
+ key.m_Prefix.m_Cid = cid;
+
+ Env::DerivePk(key.m_KeyInContract, &cid, sizeof(cid));
+
+ char msg[HelloWorld::MSG_MAXSIZE];
+ Env::VarReader::Read_T(key, msg);
+
+ Env::DocGroup root("");
+ Env::DocAddText("Your message", msg);
+}
+
BEAM_EXPORT void Method_0()
{
Env::DocGroup root("");
@@ -84,7 +108,14 @@ BEAM_EXPORT void Method_0()
{
Env::DocGroup grRole("user");
{
+ Env::DocGroup grMethod("send_msg");
+ Env::DocAddText("cid", "ContractID");
+ Env::DocAddText("msg", "string");
}
+ {
+ Env::DocGroup grMethod("get_my_msg");
+ Env::DocAddText("cid", "ContractID");
+ }
}
}
}
@@ -92,6 +123,8 @@ BEAM_EXPORT void Method_0()
BEAM_EXPORT void Method_1()
{
const Actions_map_t VALID_USER_ACTIONS = {
+ {"send_msg", On_action_send_msg},
+ {"get_my_msg", On_action_get_my_msg},
};
const Actions_map_t VALID_MANAGER_ACTIONS = {
- save and exit
- build your shader:
make- fix compilation errors if any
- jump into your beam directory:
cd beam- export your owner key:
wallet/cli/beam-wallet-masternet -n=eu-node01.masternet.beam.mw:8100,eu-node02.masternet.beam.mw:8100,eu-node04.masternet.beam.mw:8100,eu-node04.masternet.beam.mw:8100 export_owner_key- start your local node:
beam/beam-node-masternet --peer=eu-node01.masternet.beam.mw:8100,eu-node02.masternet.beam.mw:8100,eu-node04.masternet.beam.mw:8100,eu-node04.masternet.beam.mw:8100 --port=8501 --fast_sync=on --owner_key={your_owner_key}- deploy your contract:
wallet/cli/beam-wallet-masternet -n localhost:8501 shader --shader_app_file={path_to_your_shader_directory}/shaders/app.wasm --shader_contract_file={path_to_your_shader_directory}/shaders/contract.wasm --shader_args="role=manager,action=create_contract"- get your contract's CID:
wallet/cli/beam-wallet-masternet -n localhost:8501 shader --shader_app_file={path_to_your_shader_directory}/shaders/app.wasm --shader_args="role=manager,action=view_contracts"Output:
Shader output: "contracts": [{"cid": "fde65e7875de624e3e460d426c0288c3b587ac42840b21f65dfef73f52936b3d","Height": 23}]
- test your methods:
wallet/cli/beam-wallet-masternet -n localhost:8501 shader --shader_app_file={path_to_your_shader_directory}/shaders/app.wasm --shader_args="role=user,action=send_msg,msg=HelloWorld\!,cid={your_cid}"wallet/cli/beam-wallet-masternet -n localhost:8501 shader --shader_app_file={path_to_your_shader_directory}/shaders/app.wasm --shader_args="role=user,action=get_my_msg,cid={your_cid}"Congratulations! You just wrote your first contract :)