PlatONE是由萬向區塊鏈與合作伙伴聯合打造的支持隱私計算的區塊鏈聯盟鏈,本文主要介紹PlatONE Wasm合約開發環境配置方法; Wasm合約編譯 及 Wasm合約部署及呼叫,方便大家對Wasm合約進行初步了解,快速掌握Wasm合約開發技巧,
1. 配置Wasm合約開發環境
獲取最新穩定版的WASM合約發布包,并進行解壓,
wget https://github.com/PlatONEnterprise/PlatONE-Go/releases/download/v0.9.0/BCWasm_linux_release.v0.9.0.tar.gz
# 進入BCWasm目錄,然后定義路徑:
cd BCWasm
export CONTRACTSSPACE=${PWD}
在${CONTRACTSSPACE}目錄下包含了合約編譯所需的材料,合約原始碼目錄為${CONTRACTSSPACE}/appContract
獲取PlatONE最新穩定版的發布包,并進行解壓,進入解壓獲得的PlatONE_linux目錄,然后定義路徑:
wget https://github.com/PlatONEnterprise/PlatONE-Go/releases/download/v0.9.0/PlatONE_linux_v0.9.0.tar.gz
tar -xzvf PlatONE_linux_v0.9.0.tar.gz
cd PlatONE_linux
export BIN_PATH=${PWD}/bin
? 請確保 ${BIN_PATH}設定在當前的作業Shell,以讓該環境變數生效,
2. 構建專案及編譯合約
cd ${CONTRACTSSPACE}
# 1. 構建用戶合約
./script/autoprojectForApp.sh . my_contract
# 2. 構建工程
./script/autoprojectForApp.sh .
# 3. 編譯合約
cd build
make my_contract
2.1. 構建專案
第一步時,會在${CONTRACTSSPACE}/appContract下構建新的合約目錄my_contract,
第二步時,會在${CONTRACTSSPACE}下創建build,并編譯合約,
此時,build目錄下的結構如下所示
├── appContract
│ ├── appDemo
│ │ ├── appDemo.bc
│ │ ├── appDemo.cpp.abi.json ## 合約的abi檔案
│ │ ├── appDemo.cpp.bc
│ │ ├── appDemo.s
│ │ ├── appDemo.wasm ## 合約的wasm位元組碼
│ │ ├── appDemo.wast
│ │ ├── CMakeFiles
│ │ ├── cmake_install.cmake
│ │ └── Makefile
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── Makefile
│ └── my_contract
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── Makefile
│ ├── my_contract.cpp.abi.json ## 合約的abi檔案
│ ├── my_contract.bc
│ ├── my_contract.cpp.bc
│ ├── my_contract.s
│ ├── my_contract.wasm
│ └── my_contract.wast
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
└── Makefile
合約檔案會通過腳本autoprojectForApp.sh默認生成如下的原始碼,可以在此基礎上撰寫自己的合約,
//auto create contract
#include <stdlib.h>
#include <string.h>
#include <string>
#include <bcwasm/bcwasm.hpp>
namespace demo {
class my_contract : public bcwasm::Contract
{
public:
my_contract(){}
/// 實作父類: bcwasm::Contract 的虛函式
/// 該函式在合約首次發布時執行,僅呼叫一次
void init()
{
bcwasm::println("init success...");
}
/// 定義Event.
/// BCWASM_EVENT(eventName,arguments...)
BCWASM_EVENT(setName,const char *)
public:
void setName(const char *msg)
{
// 定義狀態變數
bcwasm::setState("NAME_KEY",std::string(msg));
// 日志輸出
// 事件回傳
BCWASM_EMIT_EVENT(setName,"std::string(msg)");
}
const char* getName() const
{
std::string value;
bcwasm::getState("NAME_KEY",value);
// 讀取合約資料并回傳
return value.c_str();
}
};
}
// 此處定義的函式會生成ABI檔案供外部呼叫
BCWASM_ABI(demo::my_contract,setName)
BCWASM_ABI(demo::my_contract,getName)
2.2. 編譯合約
進入build目錄并編譯該合約
cd ${CONTRACTSSPACE}/build
make my_contract
生成檔案如下
├build/
├-appContact/
│ └── my_contract
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── Makefile
│ ├── my_contract.cpp.abi.json ## 合約的abi檔案
│ ├── my_contract.bc
│ ├── my_contract.cpp.bc
│ ├── my_contract.s
│ ├── my_contract.wasm
│ └── my_contract.wast
主要檔案簡介:
- .bc 連接標準庫后的LLVM位元組碼檔案,含所有依賴庫;
- .json 合約對應的介面描述檔案;
- .s 匯編檔案;
- .wasm 合約編譯后的二進制檔案,位元組碼指令集;
- .wast 合約編譯后的可被認為讀懂的指令檔案;
- .cpp.bc ;LLVM 位元組碼檔案,僅包含合約代碼本身的;
其中,發布合約時需要用到的檔案為my_contract.wast和my_contract.cpp.abi.json,
3. 部署及呼叫合約
3.1. 生成合約部署賬戶
cd ${CONTRACTSSPACE}/build
../script/create_accout.sh --ip 127.0.0.1 --rpc_port 6791
該命令會創建一個新的賬戶,創建時需要輸入一個賬戶密碼,方便后續解鎖,
除了新生成一個賬戶,該命令還會在當前目錄創建一個config.json檔案,該檔案在呼叫合約時會用到,該檔案記錄節點的ip埠以及發送交易的賬號,
運行結果如下:
nodeid: 127.0.0.1
rpc_port: 6791
###########################################
#### Create an account ####
###########################################
Input account passphrase.
passphrase: your_phrase
--output{"jsonrpc":"2.0","id":1,"result":"0x08e7988e60ab5aa49d1f7aa9435ac91b9fcf772c"} --output
New account: 0x08e7988e60ab5aa49d1f7aa9435ac91b9fcf772c
{"jsonrpc":"2.0","id":1,"result":true}
127.0.0.1:6791
Create config.json for contract-deploy
{
"url":"http://127.0.0.1:6791",
"gas":"0x0",
"gasPrice":"0x0",
"from":"0x08e7988e60ab5aa49d1f7aa9435ac91b9fcf772c"
}
組態檔欄位簡述:
urlPlatONE節點開放的JSON-RPC地址資訊;from發布合約者的賬戶地址,
長時間沒用使用賬戶發送過交易,或者節點重啟后,賬戶會被鎖定,不能發送交易,需要使用如下命令,重新為賬戶解鎖,
../script/unlock_account.sh \
--account 0x08e7988e60ab5aa49d1f7aa9435ac91b9fcf772c \
--phrase "your_phrase" \
--ip 127.0.0.1 \
--rpc_port 6791
3.2. 部署合約
cd ${CONTRACTSSPACE}/build
# ctool是用來部署合約及發送交易的工具,
cp ${BIN_PATH}/ctool .
# 部署合約
./ctool deploy --abi appContract/my_contract/my_contract.cpp.abi.json --code appContract/my_contract/my_contract.wasm --config ./config.json
結果:
trasaction hash: 0x2f3a868d8ceb60804a830e5fc35611e3ae22ccb6ef298830acd84aba41f6dd99
contract address: 0x2ee8d0545ebd20f9a992ff54cb0f21a153539206
ctool工具使用方式主要有以下兩種:
# 合約部署
./ctool \
deploy \
--abi contract.cpp.abi.json \
--code contract.wasm \
--config ./config.json
# 合約呼叫
./ctool \
invoke \
--abi contract.cpp.abi.json \
--addr "合約地址: 0x1234" \
--config ./config.json \
--func "方法名字" \
--param "第1個引數" \
--param "第2個引數"
- 提示1: 如果命令列中未明確指明組態檔路徑,則會在當前作業路徑讀取檔案:config.json,
- 提示2: 發布合約到PlatONE網路,需要連接到節點,并保證發布合約的賬戶已進行了解鎖操作,且沒有超時,執行git-bash.exe打開git-bash視窗,
- 提示3: 如果命令不能執行,請確保腳本具有執行權限,可使用命令:chmod +x ctool 進行授權,
3.3. 呼叫合約
呼叫合約的setName方法
#地址需要改成上節生成的地址
./ctool invoke --addr 0x2ee8d0545ebd20f9a992ff54cb0f21a153539206 --abi appContract/my_contract/my_contract.cpp.abi.json --config ./config.json --func "setName" --param "wxbc"
request json data:[{"from":"0x32ab0a20b589f40c7e3d6ee485a2404bb7269f87","to":"0x2ee8d0545ebd20f9a992ff54cb0f21a153539206","gas":"0x0","gasPrice":"0x0","value":"","data":"0xdb8800000000000000028c696e766f6b654e6f746966798477786263","txType":2}]
response json:{"jsonrpc":"2.0","id":1,"result":"0xeb3680c65b393952a07ec590cef7b19fc87877a9fbb70c8e16797a97ed4cfaeb"}
呼叫合約的getName方法:
#地址需要改成上節生成的地址
./ctool invoke --addr 0x2ee8d0545ebd20f9a992ff54cb0f21a153539206 --abi appContract/my_contract/my_contract.cpp.abi.json --config ./config.json --func getName
request json data:[{"from":"0x32ab0a20b589f40c7e3d6ee485a2404bb7269f87","to":"0x2ee8d0545ebd20f9a992ff54cb0f21a153539206","gas":"0x0","gasPrice":"0x0","value":"","data":"0xd1880000000000000002876765744e616d65","txType":2},"latest"]
response json:{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047778626300000000000000000000000000000000000000000000000000000000"}
result: wxbc
4. 通過console與節點互動
4.1. 節點互動
cd ${BIN_PATH}
./platone attach http://127.0.0.1:6791
Welcome to the PlatONE JavaScript console!
instance: PlatONEnetwork/platone/v0.2.0-stable-1b13ff73/linux-amd64/go1.12.4
coinbase: 0x938c231429f5ab34244618fe0dc7380e319b470e
at block: 1557 (Tue,18 Jun 2019 16:29:12 CST)
datadir: /home/gexin/PlatONE-Workspace/chain/PlatONE_linux/data/node-1
modules: admin:1.0 eth:1.0 net:1.0 personal:1.0 rpc:1.0 web3:1.0
>
通過上面命令可以與節點互動,用于查詢相關資訊
4.2. 查詢交易receipt
#交易哈希值改成上節生成的
> eth.getTransactionReceipt("0x2f3a868d8ceb60804a830e5fc35611e3ae22ccb6ef298830acd84aba41f6dd99")
結果如下:
{
blockHash: "0x3f1e326f4b122efb26e9da417daff97dbb403c714d3324e8020ddce04b88617a",
blockNumber: 236,
contractAddress: "0x2ee8d0545ebd20f9a992ff54cb0f21a153539206",
cumulativeGasUsed: 1996535,
from: "0x32ab0a20b589f40c7e3d6ee485a2404bb7269f87",
gasUsed: 1996535,
logs: [],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
status: "0x1",
to: null,
transactionHash: "0x2f3a868d8ceb60804a830e5fc35611e3ae22ccb6ef298830acd84aba41f6dd99",
transactionIndex: 0
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/249530.html
標籤:區塊鏈
