1. 程式人生 > >EOS智慧合約開發(四)EOS智慧合約部署及除錯(附程式設計示例)

EOS智慧合約開發(四)EOS智慧合約部署及除錯(附程式設計示例)

EOS的智慧合約裡面有一個action(動作)和transaction(交易)的概念。
對於我們開發以太坊開發者來說,基本上只有transaction的概念。如果我只要執行一種操作,而且是隻讀操作,就不需要簽名。如果需要劃資金,有一些寫的操作,那就需要使用者用私鑰對這個操作去簽名,然後pos的一個transaction,這是以太坊的概念。
對於EOS,它多了一個action的概念,action其實它也是對一個智慧合約中的某個函式的呼叫。transaction是由一個或者多個action組合而成的關係,就是在一個transaction裡,可以包含多個action,這樣你可以在一個transaction裡籤一次名,就可以調多個函式,做一組操作。
部署智慧合約


載入基礎IO智慧合約

現在我們擁有了一個錢包default,該錢包內部包含一個預設主金鑰的賬戶eosio,預設的智慧合約eosio.bios已經可以使用,這個合約是EOS很多基本action的基礎系統,所以要保證這個合約的有效執行。這個合約可以讓你能夠直接控制資源分配,並且有許可權訪問API。在公鏈上,這個合約將管理已募集和待募集token,以儲備頻寬給CPU、記憶體以及網路活動使用。我們提取一下重點:

  • 建立錢包
  • 匯入賬戶
  • 預設合約eosio.bios,它的功能是控制資源分配。

這個預設合約eosio.bios可以在EOS原始碼位置contracts/eosio.bios找到。可以通過cleos來指定這個合約執行:
部署智慧合約的示例程式碼如下:

$ cleos set contract eosio build/contracts/eosio.bios -p eosio

其中,eosio是要部署的賬號,就是你用哪個賬號去部署智慧合約;
build/contracts/eosio.bios表示的是路徑;
eos.bios是生成一個智慧合約的目錄。
執行結果:

cleos set contract eosio build/contracts/eosio.bios -p eosio
Reading WAST/WASM from build/contracts/eosio.bios/eosio.bios.wasm...
Using already assembled WASM...
Publishing contract...
Error 3080006: transaction took too long
----------------------

出現上面問題,如何解決
經過分析,nodeos程式啟動時新增max-transaction-time即可解決這個問題

nodeos -e -p eosio --max-transaction-time=1000
#加入--max-transaction-time=1000  //可以解決問題

再次執行


[email protected]:~/eos$ cleos set contract eosio build/contracts/eosio.bios -p eosio                                                                   
Reading WAST/WASM from build/contracts/eosio.bios/eosio.bios.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 00979d5d016d61308905e5fc74365eef81a26b4d715791de1de0550d3468fecf  3728 bytes  3130 us
#         eosio <= eosio::setcode               {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d01000000016                                                                   21260037f7e7f0060057f7e7e7e7e...
#         eosio <= eosio::setabi                {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e30050c6163636f756                                                                   e745f6e616d65046e616d650f7065...

對一些命令做一些闡釋:

  • 命令列工具仍舊是使用cleos,通過set contract來執行指定合約,後面跟著賬戶名稱(這裡是預設的eosio,我們剛剛匯入(**他的私鑰,私鑰在config.ini
    中**。)),然後是指定合約的路徑。
  • 命令最後的“-p eosio”的含義是:使用賬戶eosio(使用的是賬戶的私鑰)來為這個action簽名。
  • 讀取 WAST/WASM檔案(這個檔案是被新部署到build目錄下的)
  • 裝配 WASM
  • 釋出合約
  • 執行交易(合約也是一個交易),這裡通過兩個動作來生成一個交易,
    • setcode,code描述了合約是如何執行的。
    • setabi,abi描述瞭如何在二進位制檔案和json檔案(代表了各種引數)中轉換。 從技術角度來講,abi是可選的,所有的EOSIO工具取決於它的易用性。
eosio <= eosio::setcode  {...}

上面一行的閱讀方式為:action setcode是eosio名稱空間下的,同時它是通過eosio賬戶授權來執行的,帶的引數有…

注意,action 是可以被多個合約執行的。

我們通過eosio超級賬戶,部署系統合約eosio.system
命令如下:

[email protected]:~/eos$ cleos set contract eosio build/contracts/eosio.system -p eosio
Reading WAST/WASM from build/contracts/eosio.system/eosio.system.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: cb59ffd674df7c4c6ef98fff0fe052700a95521c7d36a92b38684dc17a478fc3  36768 bytes  13096 us
#         eosio <= eosio::setcode               {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001b0022e60037f7e7e0060017f006002...
#         eosio <= eosio::setabi                {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e30050c6163636f756e745f6e616d65046e616d650f7065...

為了管理Token,我們可以建立eosio.token賬號來專門用來執行token智慧合約。

cleos create account eosio eosio.token EOS641B9XFbXQjobCdQKLPDw5sZzvv5ZieMbyabiHVu88SFgo8tBf EOS5yJk7uY34QPoBuQx8WAZfFmybEACVnEkfg8fnRbWd1d5Q86MMV
executed transaction: e4a3673f5e89c844c61e903e4dd67e635e86a9aa13463b204de0b6fdedbee9fb  200 bytes  197 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"eosio.token","owner":{"threshold":1,"keys":[{"key":"EOS641B9XFbXQjobCdQKL...

查詢我建立的賬戶

cuijb@cuijb-VirtualBox:~/eos$ cleos get accounts EOS641B9XFbXQjobCdQKLPDw5sZzvv5ZieMbyabiHVu88SFgo8tBf
{
  "account_names": [
    "eosio.token",
    "jambeau",
    "jambeau1",
    "jambeau2"
  ]
}

我剛才建立的eosio.token建立成功。

接下來,我們使用這個賬戶部署eosio.token智慧合約,同樣通過上面學習到的方式:指定路徑,指定加密賬戶{-p eosio.token}:

[email protected]:~/eos$ cleos set contract eosio.token build/contracts/eosio.token -p eosio.token
Reading WAST/WASM from build/contracts/eosio.token/eosio.token.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: d4a169320ea8200d0ab438a111b7baac4caebcbb2d9860d648523b36d5de37e4  8104 bytes  1001 us
#         eosio <= eosio::setcode               {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d01000000017e1560037f7e7f0060057f7e...
#         eosio <= eosio::setabi                {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e30010c6163636f756e745f6e616d65046e616d65...

我們對部署合約做一些闡釋:
cleos set contract 部署合約賬號 部署合約路徑 -p 部署合約賬號簽名:例如:
cleos set contract eosio.token build/contracts/eosio.token -p eosio.token

建立EOS的代幣
就像以太坊token那樣,我們在EOS上可以更加方便的建立一個基於EOS的代幣。首先,去token合約中的標頭檔案eosio.token.hpp,檢視一下token相關的介面都有哪些,其中有一個create函式,我們正是將要使用這個函式來建立token,所以我們可以留意一下它的引數都包括哪些。

我們可以通過命令列來呼叫該create函式:

[email protected]:~/eos$ cleos  push action eosio.token create '["eosio","100000000000000.0000 SYS"]' -p eosio.token
executed transaction: e5e3d25b6de3aac9863051eaa486be06fe835bb5ff211a91365e7e1c1644b405  120 bytes  240 us
#   eosio.token <= eosio.token::create          {"issuer":"eosio","maximum_supply":"100000000000000.0000 SYS"}
  • 命令列使用push action來執行這個動作
  • 動作是eosio.token賬戶create這個合約的
  • 動作的引數包括:eosio是發行人的賬號,發行量是100000000000000EOS。
  • 動作的執行人(簽名者)是eosio.token,用來授權這個動作的執行(必須和部署合約的賬戶一致

直接按引數順序傳入值比較方便,如果你需要更加準確的傳值,可以將以上動作的引數內容改寫為“Key,Value”的形式改造一下,會比較冗餘。

代幣發放
我們已經發行了一種代幣EOS,下面我們可以將這個代幣EOS發放給賬戶eosio

引用塊內容

(我們上面建立的)。繼續檢視那個eosio.token.hpp標頭檔案中關於issue(發放)操作的引數。

void issue( account_name to, asset quantity, string memo );// memo:備註,一般可以不填寫。

我們分析一下 issue這個Action一些內容

void token::issue( account_name to, asset quantity, string memo )
{
    auto sym = quantity.symbol;  //獲取代幣物件
    eosio_assert( sym.is_valid(), "invalid symbol name" );
    eosio_assert( memo.size() <= 256, "memo has more than 256 bytes" );

    auto sym_name = sym.name();//獲取代幣名稱(例如EOS,...)
    stats statstable( _self, sym_name );
    auto existing = statstable.find( sym_name );
    eosio_assert( existing != statstable.end(), "token with symbol does not exist, create token before issue" );
    const auto& st = *existing;

    require_auth( st.issuer );// 檢查發行人許可權,是否有足夠
    eosio_assert( quantity.is_valid(), "invalid quantity" );
    eosio_assert( quantity.amount > 0, "must issue positive quantity" );

    eosio_assert( quantity.symbol == st.supply.symbol, "symbol precision mismatch" );
    eosio_assert( quantity.amount <= st.max_supply.amount - st.supply.amount, "quantity exceeds available supply");

    statstable.modify( st, 0, [&]( auto& s ) {
       s.supply += quantity;
    });

    add_balance( st.issuer, quantity, st.issuer );//實現轉賬

    if( to != st.issuer ) {
       SEND_INLINE_ACTION( *this, transfer, {st.issuer,N(active)}, {st.issuer, to, quantity, memo} );


> 引用塊內容

//呼叫行內函數 transfer函式,將傳送action事件,將交易寫入blcok中。
    }
}

然後,我們繼續使用命令列工具cleos來push action到智慧合約eosio.token中這個issue函式中:

[email protected]:~/eos$ cleos  push action eosio.token issue  '["eosio","20000000000000.0000 SYS","issue"]' -p eosio
executed transaction: 32cb94b523ec6061521a397cfcbc706cf3dc9c01430ca5b4e08278a588686482  128 bytes  388 us
#   eosio.token <= eosio.token::issue           {"to":"eosio","quantity":"20000000000000.0000 SYS","memo":"issue"}

注意,在命令列結尾處,我們仍要使用賬戶來簽名授權,這裡是使用者eosio(因為上面eosio是發行者,全都發行到它的兜裡啦,所以要從它兜裡取錢)。

執行發放動作,通過日誌可以看到包括了幾個步驟:

  • eosio名稱空間(就是程式碼中的eosio包內)下的發放函式issue,該操作由使用者eosio授權(因為正是eosio授權的代幣發行!)
  • 這三行transfer都是eosio名稱空間下的transfer函式,他們都是內聯交易:是由上面的發放函式issue自動觸發的
    • 第一行由賬戶eosio授權,執行issue函式。executed transaction: 32cb94b523ec6061521a397cfcbc706cf3dc9c01430ca5b4e08278a588686482 128 bytes 388 us 說明執行這筆交易,佔用128bytes 花費了 388 uss 時間
    • 第二行由賬戶eosio授權,執行transfer函式。”>> transfer”就是該函式的輸出。# eosio.token <= eosio.token::issue {“to”:”eosio”,”quantity”:”20000000000000.0000 SYS”,”memo”:”issue”}
      這行資訊清晰的描述了這筆資產是發放到eosio這個賬戶裡,數量,備註資訊issue。
      transfer內部呼叫(notified)sub_balance和add_balance

實際上,eosio.token (合約賬號),可以直接修改賬戶餘額而不使用“內聯呼叫transfer”。但是這種情況下,eosio.token智慧合約會要求我們的token必須有所有的賬戶餘額,通過計算引用過他們的所有交易動作的總和。它還需要傳送者和接收者的存款情況,以支援他們可以自動處理充值和提現。

如果你想看到廣播出去的真實交易的情況,可以使用-d -j選項來表達“不要廣播”以及“以json格式返回交易”:
“不要廣播”的意思是這條動作無效,只是用來做測試的。(這與上面的廣播出去的“真實交易”不同)

cuijb@cuijb-VirtualBox:~/eos$ cleos  push action eosio.token issue  '["eosio","100.0000 SYS","issue"]' -p eosio -d -j
{
  "expiration": "2018-07-22T03:16:02",
  "ref_block_num": 19140,
  "ref_block_prefix": 1093201444,
  "max_net_usage_words": 0,
  "max_cpu_usage_ms": 0,
  "delay_sec": 0,
  "context_free_actions": [],
  "actions": [{
      "account": "eosio.token",
      "name": "issue",
      "authorization": [{
          "actor": "eosio",
          "permission": "active"
        }
      ],
      "data": "0000000000ea305540420f00000000000453595300000000056973737565"
    }
  ],
  "transaction_extensions": [],
  "signatures": [
    "SIG_K1_KkQYRenPfx2hWYY36tHkBJXJWN4MAqXfes3dNZTacczpFRVWGh84Jy4kGP1t5kMNeMA2WEqiiBMacYwgraHA9orZrjZphf"
  ],
  "context_free_data": []
}

代幣交易
現在eosio賬戶已經存在20000000000000.0000個EOS代幣了,我們使用上面建立的另一個賬戶jambeau,用來測試代幣交易:從eosio賬戶中轉出一部分EOS到jambeau賬戶。

同樣的,我們還是先來看一下原始碼中設計的transfer函式的引數列表:


void token::transfer( account_name from, //轉賬人
                      account_name to,  //接收人
                      asset        quantity, //數量
                      string       memo ) //備註

我們做一筆轉賬,從eosio轉賬到jambeau 100.0000 SYS

[email protected]:~/eos$ cleos push action eosio.token transfer '["eosio","jambeau","100.0000 SYS","I love you"]' -p eosio
executed transaction: 6d849aa36c884ab8c98d0ef239b63bac5d9945bf83a92e626e01f0f339bcca64  136 bytes  546 us
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"jambeau","quantity":"100.0000 SYS","memo":"I love you"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"jambeau","quantity":"100.0000 SYS","memo":"I love you"}
#       jambeau <= eosio.token::transfer        {"from":"eosio","to":"jambeau","quantity":"100.0000 SYS","memo":"I love you"}

我們現在查詢一下jambeau的賬戶的餘額。

cuijb@cuijb-VirtualBox:~/eos$ cleos get table eosio.token jambeau accounts
{
  "rows": [{
      "balance": "100.0000 SYS"
    }
  ],
  "more": false
}

我們分析一下查詢賬戶資訊的命令

cleos get table ‘{合約名稱}’ ‘{賬戶名稱}’ accounts

我再通過jambeau賬戶給jamebau1 轉賬50.0000 SYS,通過jambeau做簽名。

[email protected]:~/eos$ cleos push action eosio.token transfer '["jambeau","jambeau1","50.0000 SYS","by jambeau sign"]' -p jambeau
executed transaction: 8cf97e5a31ffdfbf69d242167112b98f16b42103634c7ff9b3199ed5346efc9d  144 bytes  444 us
#   eosio.token <= eosio.token::transfer        {"from":"jambeau","to":"jambeau1","quantity":"50.0000 SYS","memo":"by jambeau sign"}
#      jambeau <= eosio.token::transfer        {"from":"jambeau","to":"jambeau1","quantity":"50.0000 SYS","memo":"by jambeau sign"}
#      jambeau1 <= eosio.token::transfer        {"from":"jambeau","to":"jambeau1","quantity":"50.0000 SYS","memo":"by jambeau sign"}

我們現在查詢一下jambeau1的賬戶的餘額。

cuijb@cuijb-VirtualBox:~/eos$ cleos get table eosio.token jambeau1 accounts
{
  "rows": [{
      "balance": "50.0000 SYS"
    }
  ],
  "more": false
}

jambeau1果真得到了50.0000 EOS代幣,你的轉賬,簽名都是OK的。
查詢餘額
我們需要整體研究一下cleos的所有子命令,列舉的方式比較枯燥,這裡不展開,只是使用到哪裡就展示哪裡。我們上面進行了代幣發放和代幣交易,此時三個測試賬戶eosio,jambeau和ajmbeau1的EOS餘額都發生了變化。下面我們要利用cleos查詢一下這兩個賬戶的代幣EOS的餘額狀況:

cuijb@cuijb-VirtualBox:~/eos$ cleos get currency balance eosio.token eosio SYS
19999999999900.0000 SYS
cuijb@cuijb-VirtualBox:~/eos$ cleos get currency balance eosio.token jambeau SYS
50.0000 SYS
cuijb@cuijb-VirtualBox:~/eos$ cleos get currency balance eosio.token jambeau1 SYS
50.0000 SYS

我們可以清晰的查出我三個賬戶的餘額情況
我們再建立一個CAC程式碼,代幣數量1000000000.0000 CAC

[email protected]:~/eos$ cleos  push action eosio.token create '["eosio","1000000000.0000 CAC"]' -p eosio.token
executed transaction: 982b4004708efe840cd30b5dd5cfd65775fee808ae51a0378eef262a347d2cff  120 bytes  326 us
#   eosio.token <= eosio.token::create          {"issuer":"eosio","maximum_supply":"1000000000.0000 CAC"}

我們再次分發給 jambeau 10000000.0000 CAC 代幣

[email protected]-VirtualBox:~/eos$ cleos puch action issue '["jamebau,"200000000.0000 CAC","issue"]' -p eosio.token
Host and port options (-H, --wallet-host, etc.) have been replaced with -u/--url and --wallet-url
Use for example -u http://localhost:8888 or --url https://example.invalid/

分發成功,我們先查詢一下當前賬戶jamebau的餘額

cuijb@cuijb-VirtualBox:~/eos$ cleos get table eosio.token jambeau accounts
{
  "rows": [{
      "balance": "10000000.0000 CAC"
    },{
      "balance": "50.0000 SYS"
    }
  ],
  "more": false
}

我們可以清晰的查詢到我們分發的資產 ;
我們下一步插敘一下餘額試試看

#查詢所有的幣種的餘額
cuijb@cuijb-VirtualBox:~/eos$ cleos get currency balance eosio.token jambeau
10000000.0000 CAC
50.0000 SYS
#查詢幣種的餘額
cuijb@cuijb-VirtualBox:~/eos$ cleos get currency balance eosio.token jambeau CAC
10000000.0000 CAC

除錯智慧合約
現在user官方網站推薦的一個除錯方法就是print,把資訊打印出來。這個必須要我們搭建本地節點,因為如果沒有本地節點,相當於你print列印在別人的節點上,你根本看不到這個列印資訊是什麼,所以說你必須要搭建一個本地節點。搭建本地節點後,你執行智慧合約,就會看到print出來的輸出結果。
EOS智慧合約的RPC介面
其實智慧合約整個只完成了DApp最核心的一部分,就是基本上和資金有關係的一些關鍵操作,其實大部分的介面、介面,還得我們用JavaScript、HTML去做。
那我們這些DApp其它寫介面的操作,怎麼去呼叫智慧合約呢?都是通過user智慧合約RPC介面呼叫,智慧合約的RPC介面文件連結是:https://eosio.github.io/eos/group__eosiorpc.htm

RPC的介面我們除了用C++或者用程式設計的方法去呼叫一些介面,我們可以用curl這種最簡單的方法去呼叫這個介面。curl它相當於模擬了一個瀏覽器的操作,我可以向我的執行節點的RPC埠發訊息。
這裡面我可以給大家展示,我列了3個。

1.get_info:獲得節點資訊。通過呼叫這個介面,它會返回我執行節點,比如說server version,就是我執行節點這個節點的版本號;head blocknum,是我當前挖到哪個塊了。
如下命令:

curl http://127.0.0.1:8888/v1/chain/get_info

2 . get_block:獲得一個塊的資訊。呼叫該介面,指定塊號(blocknum),就可以獲得指定塊的詳細資訊。
如下命令:

$ curl http://127.0.0.1:8888/v1/chain/get_block -X POST -d'{"block_num_or_id":5}'

3.get_account:獲得某個賬號的資訊。呼叫這個介面,可以獲得當前我的一個賬號資訊
命令如下:

$ curlhttp://127.0.0.1:8888/v1/chain/get_account -X POST -d'{"account_name":"inita"}'

EOS智慧合約程式設計示例:HelloPDJ
下面有一個程式設計示例,給大家展示一下我怎麼樣寫智慧合約的。它這個智慧合約可以用C語言(一種計算機程式語言)來寫,也可以用C++(一種計算機程式語言)來寫,這裡面我就用C++來寫。示例程式碼如下:

// hello.cpp原始碼
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;
class hello : public eosio::contract {
   public: using contract::contract;
   /// @abi action
    void hi( account_name user )
             {print( “Hello, ”, name{user} ); }
};
EOSIO_ABI( hello, (hi) )

如果我自己寫了一個智慧合約,怎麼去編譯和部署呢?編譯的步驟大概是這樣的:

第一步,編譯hello檔案

$ eosiocpp -o hello.wasthello.cpp
$ eosiocpp -g hello.abihello.cpp
#或則一個辦法
$ sudo ./eosio_build.sh

第二步,建立賬號

$cleos create account eosio hello.codeEOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 ...

第三步,部署合約

cleos set contract hello.code../hello -p hello.code

第四步,呼叫合約

cleos push action hello.codehi '["user"]' -p user

恭喜你,你已經成功部署了智慧合約。整個過程,都是基於命令列完成的。目前沒有太多機構開發相關套件支援EOS合約開發。所以,需要些一些複雜的合約,還是有點困難的。希望更多人架構參與進來。

2018年7月11日整理於深圳。

相關推薦

EOS智慧合約開發EOS智慧合約部署除錯(程式設計示例)

EOS的智慧合約裡面有一個action(動作)和transaction(交易)的概念。 對於我們開發以太坊開發者來說,基本上只有transaction的概念。如果我只要執行一種操作,而且是隻讀操作,就不需要簽名。如果需要劃資金,有一些寫的操作,那就需要使用者用

EOS智慧合約開發EOS的許可權和許可

今天我們探討EOS的許可權和許可問題 1.基本概念 我們先了解下EOS.IO許可權模型的三個基本概念:  Wallets(錢包)——錢包是EOS.IO提供的用於管理金鑰對的客戶端,錢包支援鎖定和密碼解鎖。 Accounts (賬戶)——賬戶是公示在區塊鏈上的人工易讀(

星雲鏈智能合約開發:在星雲鏈上發送交易

星雲鏈智能合約開發 在星雲鏈上發送交易 準備賬戶 在星雲鏈上,每個地址表示一個唯一的賬戶,一一對應。 在發送交易前,我們需要準備兩個賬戶:一個賬戶用來發送代幣 (稱為"from") 和另一個賬戶來接受代幣 (稱為"to"). 發送者賬戶 在這裏,我們將會使用配置

手把手教你智慧硬體開發 藍芽傳輸

第4節 藍芽傳輸 智慧硬體基本上都需要和手機相連,然後讓手機控制這些硬體的工作。相連的方式不外乎以下三種, 資料線有線連線,通過一根資料線把智慧硬體和手機連線起來。採用這種方式,需要一個特殊的帶USB HOST功能的擴充套件板; WIFI連線,智慧硬體和手

EOS智慧合約開發

一、 智慧合約功能 EOSIO智慧合約是在區塊鏈上註冊並在EOSIO節點上執行的軟體,實現了“合約”的功能,合約行動請求帳目儲存在區塊鏈中。智慧合約定義了介面(操作,引數,資料結構)和實現介面的程式碼。程式碼被編譯成規範的位元組碼格式,使節點可以檢

智慧合約開發4—— solidity例項

1.投票 這個合約比較複雜,但其中展示了很多的Solidity的特性。它實現了一個投票合約。電子投票的主要問題是如何給正確的人分配投票權,以及如何防止操縱。我們不會在這裡解決所有問題,但我們會展示如何進行委派投票,以便記票自動且完全透明。 idea 是為每個選票建立一個合約,為每個投票

Qt移動應用開發:應用粒子特效

ons -i 遊戲 direct mit class png pop 狀態 Qt移動應用開發(四):應用粒子特效 上一篇文章介紹了Qt Quick是如何對幀動畫進行支持的。幀動畫的實現離不開狀態機、而狀態機、動畫和狀態切換(transition

corethink功能模塊探索開發讓這個模塊跑起來

src 後臺菜單 evel pst 新建 mod depend htm news 讓這個模塊跑起來,太費勁了,多半原因是自己太粗心,opencmf.php中“uid”寫成了“pid”,de了好幾天的bug也沒有搞出來,又加上最近發生了些事(brokenhearted)。。。

星雲鏈智能合約開發:Mac下安裝的準備工作

星雲鏈開發環境安裝 nebulasio安裝 星雲鏈安裝 星雲鏈開發 智能合約開發 Homebrew安裝 包管理工具可以讓你安裝和更新程序變得更方便,目前在Mac系統中最受歡迎的包管理工具是 Homebrew. 我們安裝Homebrew是為了安裝星雲鏈開發環境時更方便快捷。 安裝方法 第一步

星雲鏈智能合約開發:Mac下安裝星雲鏈

Mac下安裝星雲鏈 星雲鏈智能合約開發 Golang環境搭建 版本用最新版:1.10.2 安裝 brew install go 配置環境變量 vi ~/.bash_profile 打開.bash_profile文件,按"i"鍵可進行編輯,添加: export GOROOT=/u

星雲鏈智能合約開發:運行星雲鏈

星雲鏈智能合約開發 安裝星雲鏈 創世區塊配置 在項目根目錄下的conf/default/genesis.conf,為創世區塊配置文件。 meta { # 每條鏈的唯一標識 # 每個區塊和交易只會屬於一條唯一的鏈,保證安全性 chain_id: 100 } consensus { #

星雲鏈智能合約開發:安裝Chrome錢包插件和web錢包及其使用

星雲鏈智能合約開發 安裝星雲鏈Chrome錢包插件 安裝星雲鏈web錢包 安裝Chrome瀏覽器錢包插件 下載地址:https://github.com/ChengOrangeJu/WebExtensionWallet 第一步:clone項目或者下載zip包到本地 第二步:安裝 打開Chrom

星雲鏈智能合約開發:Dapp開發

星雲鏈智能合約開發 星雲鏈Dapp開發 星雲鏈智能合約Dapp開發 Dapp開發 安裝neb.js neb.js提供javascript開發的API接口 創建一個neb文件夾,在終端命令行中進入該文件夾,克隆neb.js git clone https://github.com/nebula

星雲鏈智能合約開發:智能合約中調用內置庫

星雲鏈智能合約開發 智能合約中調用內置庫 Nebulas智能合約開發 BigNumber BigNumber 模塊構建於 bignumber.js之上,用來處理任意精度的十進制和非十進制運算。合約可以直接使用 BigNumber 來處理交易和其他轉賬操作中涉及到的數值計算。 var value

Go語言開發、Go語言面向對象

name value code 對象 struct int() 初始 每一個 method Go語言開發(四)、Go語言面向對象 一、結構體和方法 1、結構體的定義 在結構體中可以為不同項定義不同的數據類型。結構體是由一系列具有相同類型或不同類型的數據構成的數據集合。結構體

EOS小白學習EOS的HTTP API

oot 沒有 uid ++ 討論 created ant mon pack 歡迎來到EOS小白學習系列,本系列會記錄EOS學習過程中的一些操作和細節,大餅果子非C++出身,如有錯誤,歡迎指出 接上一篇: 本篇將會列出EOS支持的HTTP API(chain和history

PHP全棧開發: HTML 學習2. div 布局

樣式 nbsp oat clas 控制 color 兩個 如果 排列 無序列表,有序列表,自定義列表 無序列表是ul表示,每個元素用li表示 有序列表是ol表示,每個元素用li表示 <ul> <li>首頁</li>&

從零開始學習比特幣開發--網路初始化,載入區塊鏈和錢包,匯入區塊啟動節點

寫在前面: 本篇文章接續 從零開始學習區塊鏈技術(三)-接入比特幣網路的關鍵步驟解析、建立比特幣錢包,以及重要rpc指令 從零開始學習區塊鏈技術(二)–如何接入比特幣網路以及其原理分析 以及從零開始學習區塊鏈技術(一)–從原始碼編譯比特幣 如果這篇文章看不明白,請務必先閱讀之前的文章

瀏覽器外掛之ActiveX開發----web頁面呼叫ActiveX

轉自:http://www.cnblogs.com/qguohog/archive/2013/01/25/2876828.html https://blog.csdn.net/zengraoli/article/details/12078757?utm_source=blogxgwz3 &n

Dojo開發

Dojo中的事件 使用dojo.connect函式,可以繫結相應事件到DOM元素上。 如下示例:給一個div元素新增點選事件,當點選的時候彈出文字內容。 <body> <div id="message">點選事件的繫結</div> <