1. 程式人生 > >03 編寫並執行智慧合約 ---》星雲鏈開發

03 編寫並執行智慧合約 ---》星雲鏈開發

Nebulas 3200 萬獎金的 DApp 開發激勵計劃

時間: 2018  5  7  7  2 

每提交一個有效 DApp 即可獲得 100 NAS  7000 元)

會的話可以試試!專為咱們 Javascript 提供哈,返的獎金可平分返給你!

QQ群交流:613121183

-----------------------------------------------------------------------

在這篇教程中我們會學習怎樣在Nebulas中編寫、部署並執行智慧合約。

準備工作

在進入智慧合約之前,先溫習下先前學過的內容:

  1. 安裝、編譯並啟動neb應用
  2. 建立錢包地址,設定coinbase,並開始挖礦
  3. 查詢neb節點資訊、錢包地址餘額等
  4. 傳送轉賬交易,並驗證交易是否成功

如果對上述的內容有疑惑的同學可以重新去學習前面的章節,接下來我們會通過下面的步驟來學習和使用智慧合約:

  1. 編寫智慧合約
  2. 部署智慧合約
  3. 呼叫智慧合約,驗證合約執行結果

編寫智慧合約

跟以太坊類似,Nebulas實現了NVM虛擬機器來執行智慧合約,NVM的實現使用了JavaScript V8引擎,所以當前的開發版,我們可以使用JavaScript、TypeScript來編寫智慧合約。

編寫智慧合約的簡要規範:

  1. 智慧合約程式碼必須是一個Prototype的物件;
  2. 智慧合約程式碼必須有一個init()的方法,這個方法只會在部署的時候被執行一次;
  3. 智慧合約裡面的私有方法是以_開頭的方法,私有方法不能被外部直接呼叫;

下面我們使用JavaScript來編寫第一個智慧合約:銀行保險櫃。 這個智慧合約需要實現以下功能:

  1. 使用者可以向這個銀行保險櫃存錢。
  2. 使用者可以從這個銀行保險櫃取錢。
  3. 使用者可以查詢銀行保險櫃中的餘額。

智慧合約示例:

'use strict';

var DepositeContent = function (text) {
  if (text) {
    var o = JSON.parse(text);
    this.balance = new BigNumber(o.balance);
    this.expiryHeight = new BigNumber(o.expiryHeight
); } else { this.balance = new BigNumber(0); this.expiryHeight = new BigNumber(0); } }; DepositeContent.prototype = { toString: function () { return JSON.stringify(this); } }; var BankVaultContract = function () { LocalContractStorage.defineMapProperty(this, "bankVault", { parse: function (text) { return new DepositeContent(text); }, stringify: function (o) { return o.toString(); } }); }; // save value to contract, only after height of block, users can takeout BankVaultContract.prototype = { init: function () { //TODO: }, save: function (height) { var from = Blockchain.transaction.from; var value = Blockchain.transaction.value; var bk_height = new BigNumber(Blockchain.block.height); var orig_deposit = this.bankVault.get(from); if (orig_deposit) { value = value.plus(orig_deposit.balance); } var deposit = new DepositeContent(); deposit.balance = value; deposit.expiryHeight = bk_height.plus(height); this.bankVault.put(from, deposit); }, takeout: function (value) { var from = Blockchain.transaction.from; var bk_height = new BigNumber(Blockchain.block.height); var amount = new BigNumber(value); var deposit = this.bankVault.get(from); if (!deposit) { throw new Error("No deposit before."); } if (bk_height.lt(deposit.expiryHeight)) { throw new Error("Can not takeout before expiryHeight."); } if (amount.gt(deposit.balance)) { throw new Error("Insufficient balance."); } var result = Blockchain.transfer(from, amount); if (!result) { throw new Error("transfer failed."); } Event.Trigger("BankVault", { Transfer: { from: Blockchain.transaction.to, to: from, value: amount.toString() } }); deposit.balance = deposit.balance.sub(amount); this.bankVault.put(from, deposit); }, balanceOf: function () { var from = Blockchain.transaction.from; return this.bankVault.get(from); }, verifyAddress: function (address) { // 1-valid, 0-invalid var result = Blockchain.verifyAddress(address); return { valid: result == 0 ? false : true }; } }; module.exports = BankVaultContract;

上面智慧合約的示例可以看到,BankVaultContract是一個prototype物件,這個物件有一個init()方法,滿足了我們說的編寫智慧合約最基礎的規範。

BankVaultContract實現了另外兩個方法:

  • save(): 使用者可以通過呼叫save()方法向銀行保險櫃存錢;
  • takeout(): 使用者可以通過呼叫takeout()方法向銀行保險櫃取錢;
  • balanceOf(): 使用者可以通過呼叫balanceOf()方法向銀行保險櫃查詢餘額;

上面的合約程式碼用到了內建的Blockchain物件和內建的BigNumber()方法,下面我們來逐行拆解分析合約程式碼:

save():

// Deposit the amount into the safe

save: function (height) {
  var from = Blockchain.transaction.from;
  var value = Blockchain.transaction.value;
  var bk_height = new BigNumber(Blockchain.block.height);

  var orig_deposit = this.bankVault.get(from);
  if (orig_deposit) {
    value = value.plus(orig_deposit.balance);
  }
  var deposit = new DepositeContent();
  deposit.balance = value;
  deposit.expiryHeight = bk_height.plus(height);

  this.bankVault.put(from, deposit);
},

takeout():

takeout: function (value) {
  var from = Blockchain.transaction.from;
  var bk_height = new BigNumber(Blockchain.block.height);
  var amount = new BigNumber(value);

  var deposit = this.bankVault.get(from);
  if (!deposit) {
    throw new Error("No deposit before.");
  }

  if (bk_height.lt(deposit.expiryHeight)) {
    throw new Error("Can not takeout before expiryHeight.");
  }

  if (amount.gt(deposit.balance)) {
    throw new Error("Insufficient balance.");
  }

  var result = Blockchain.transfer(from, amount);
  if (!result) {
    throw new Error("transfer failed.");
  }
  Event.Trigger("BankVault", {
    Transfer: {
      from: Blockchain.transaction.to,
      to: from,
      value: amount.toString()
    }
  });

  deposit.balance = deposit.balance.sub(amount);
  this.bankVault.put(from, deposit);
},

部署智慧合約

上面介紹了在Nebulas中怎麼去編寫一個智慧合約,現在我們需要把智慧合約部署到鏈上。在Nebulas中部署一個智慧合約其實也是傳送一個transaction來實現,前面有介紹過使用者如何在Nebulas中進行轉賬交易,由於是本地測試,我們直接使用解鎖 & 傳送的方式來發送交易。

首先,我們在conf/default/genesis.conf中預分配過代幣的賬戶裡,選擇賬戶n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so作為本章的傳送者賬號,並檢查該賬戶的狀態。

> curl -i -H Accept:application/json -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so"}'

{"result":{"balance":"5000000000000000000000000","nonce":"0","type":87}}

該賬戶有足夠的錢來支付手續費,接下來,我們解鎖傳送者賬戶n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so,解鎖12小時。

> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/admin/account/unlock -d '{"address":"n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so","passphrase":"passphrase","duration":"43200000000000"}'

{"result":{"result":true}}

然後,我們傳送部署BankVault合約的交易。

> curl -i -H 'Accept: application/json' -X POST http://localhost:8685/v1/admin/transactionWithPassphrase -H 'Content-Type: application/json' -d '{"transaction": {"from":"n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so","to":"n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so", "value":"0","nonce":1,"gasPrice":"1000000","gasLimit":"2000000","contract":{"source":"\"use strict\";var DepositeContent=function(text){if(text){var o=JSON.parse(text);this.balance=new BigNumber(o.balance);this.expiryHeight=new BigNumber(o.expiryHeight);}else{this.balance=new BigNumber(0);this.expiryHeight=new BigNumber(0);}};DepositeContent.prototype={toString:function(){return JSON.stringify(this);}};var BankVaultContract=function(){LocalContractStorage.defineMapProperty(this,\"bankVault\",{parse:function(text){return new DepositeContent(text);},stringify:function(o){return o.toString();}});};BankVaultContract.prototype={init:function(){},save:function(height){var from=Blockchain.transaction.from;var value=Blockchain.transaction.value;var bk_height=new BigNumber(Blockchain.block.height);var orig_deposit=this.bankVault.get(from);if(orig_deposit){value=value.plus(orig_deposit.balance);} var deposit=new DepositeContent();deposit.balance=value;deposit.expiryHeight=bk_height.plus(height);this.bankVault.put(from,deposit);},takeout:function(value){var from=Blockchain.transaction.from;var bk_height=new BigNumber(Blockchain.block.height);var amount=new BigNumber(value);var deposit=this.bankVault.get(from);if(!deposit){throw new Error(\"No deposit before.\");} if(bk_height.lt(deposit.expiryHeight)){throw new Error(\"Can not takeout before expiryHeight.\");} if(amount.gt(deposit.balance)){throw new Error(\"Insufficient balance.\");} var result=Blockchain.transfer(from,amount);if(!result){throw new Error(\"transfer failed.\");} Event.Trigger(\"BankVault\",{Transfer:{from:Blockchain.transaction.to,to:from,value:amount.toString()}});deposit.balance=deposit.balance.sub(amount);this.bankVault.put(from,deposit);},balanceOf:function(){var from=Blockchain.transaction.from;return this.bankVault.get(from);},verifyAddress:function(address){var result=Blockchain.verifyAddress(address);return{valid:result==0?false:true};}};module.exports=BankVaultContract;","sourceType":"js", "args":""}}, "passphrase": "passphrase"}'

{"result":{"txhash":"aaebb86d15ca30b86834efb600f82cbcaf2d7aaffbe4f2c8e70de53cbed17889","contract_address":"n1rVLTRxQEXscTgThmbTnn2NqdWFEKwpYUM"}}
  • from: 合約建立者賬戶地址
  • to: 和from一致,同為合約建立者地址
  • value:部署合約時為"0"
  • nonce: 比建立者當前的nonce多1,可以通過GetAccountState獲取建立前當前nonce
  • gasPrice:部署智慧合約用到的gasPrice,可以通過GetGasPrice獲取,或者使用預設值:"1000000"
  • gasLimit: 部署合約的gasLimit,通過EstimateGas可以獲取部署合約的gas消耗,不能使用預設值,也可以設定一個較大值,執行時以實際使用計算。
  • contract: 合約資訊,部署合約時傳入的引數
    • source: 合約程式碼
    • sourceType: 合約程式碼型別,支援jsts(對應javaScript和typeScript程式碼)
    • args: 合約初始化方法引數,無引數為空字串,有引數時為JSON陣列

部署智慧合約的返回值是transaction的hash地址txhash和合約的部署地址contract_address。 得到返回值並不能保證合約已經部署成功,因為傳送交易是一個非同步的過程,需要經過礦工打包,正如之前的轉賬交易一樣,轉賬並不能實時到賬,依賴礦工打包的速度,所以需要等待一段時間,然後可以通過查詢合約地址的資訊或者呼叫智慧合約來驗證合約是否部署成功。

驗證合約是否部署成功

在部署智慧合約的時候得到了transaction的hash地址txhash,我們可以很方便的使用console控制檯查詢transaction的hash資訊來驗證合約是否部署成功。

> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/user/getTransactionReceipt -d '{"hash":"aaebb86d15ca30b86834efb600f82cbcaf2d7aaffbe4f2c8e70de53cbed17889"}'

{"result":{"hash":"aaebb86d15ca30b86834efb600f82cbcaf2d7aaffbe4f2c8e70de53cbed17889","chainId":100,"from":"n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so","to":"n1H4MYms9F55ehcvygwWE71J8tJC4CRr2so","value":"0","nonce":"1","timestamp":"1524711841","type":"deploy","data":"eyJTb3VyY2VUeXBlIjoianMiLCJTb3VyY2UiOiJcInVzZSBzdHJpY3RcIjt2YXIgRGVwb3NpdGVDb250ZW50PWZ1bmN0aW9uKHRleHQpe2lmKHRleHQpe3ZhciBvPUpTT04ucGFyc2UodGV4dCk7dGhpcy5iYWxhbmNlPW5ldyBCaWdOdW1iZXIoby5iYWxhbmNlKTt0aGlzLmV4cGlyeUhlaWdodD1uZXcgQmlnTnVtYmVyKG8uZXhwaXJ5SGVpZ2h0KTt9ZWxzZXt0aGlzLmJhbGFuY2U9bmV3IEJpZ051bWJlcigwKTt0aGlzLmV4cGlyeUhlaWdodD1uZXcgQmlnTnVtYmVyKDApO319O0RlcG9zaXRlQ29udGVudC5wcm90b3R5cGU9e3RvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO319O3ZhciBCYW5rVmF1bHRDb250cmFjdD1mdW5jdGlvbigpe0xvY2FsQ29udHJhY3RTdG9yYWdlLmRlZmluZU1hcFByb3BlcnR5KHRoaXMsXCJiYW5rVmF1bHRcIix7cGFyc2U6ZnVuY3Rpb24odGV4dCl7cmV0dXJuIG5ldyBEZXBvc2l0ZUNvbnRlbnQodGV4dCk7fSxzdHJpbmdpZnk6ZnVuY3Rpb24obyl7cmV0dXJuIG8udG9TdHJpbmcoKTt9fSk7fTtCYW5rVmF1bHRDb250cmFjdC5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oKXt9LHNhdmU6ZnVuY3Rpb24oaGVpZ2h0KXt2YXIgZnJvbT1CbG9ja2NoYWluLnRyYW5zYWN0aW9uLmZyb207dmFyIHZhbHVlPUJsb2NrY2hhaW4udHJhbnNhY3Rpb24udmFsdWU7dmFyIGJrX2hlaWdodD1uZXcgQmlnTnVtYmVyKEJsb2NrY2hhaW4uYmxvY2suaGVpZ2h0KTt2YXIgb3JpZ19kZXBvc2l0PXRoaXMuYmFua1ZhdWx0LmdldChmcm9tKTtpZihvcmlnX2RlcG9zaXQpe3ZhbHVlPXZhbHVlLnBsdXMob3JpZ19kZXBvc2l0LmJhbGFuY2UpO30gdmFyIGRlcG9zaXQ9bmV3IERlcG9zaXRlQ29udGVudCgpO2RlcG9zaXQuYmFsYW5jZT12YWx1ZTtkZXBvc2l0LmV4cGlyeUhlaWdodD1ia19oZWlnaHQucGx1cyhoZWlnaHQpO3RoaXMuYmFua1ZhdWx0LnB1dChmcm9tLGRlcG9zaXQpO30sdGFrZW91dDpmdW5jdGlvbih2YWx1ZSl7dmFyIGZyb209QmxvY2tjaGFpbi50cmFuc2FjdGlvbi5mcm9tO3ZhciBia19oZWlnaHQ9bmV3IEJpZ051bWJlcihCbG9ja2NoYWluLmJsb2NrLmhlaWdodCk7dmFyIGFtb3VudD1uZXcgQmlnTnVtYmVyKHZhbHVlKTt2YXIgZGVwb3NpdD10aGlzLmJhbmtWYXVsdC5nZXQoZnJvbSk7aWYoIWRlcG9zaXQpe3Rocm93IG5ldyBFcnJvcihcIk5vIGRlcG9zaXQgYmVmb3JlLlwiKTt9IGlmKGJrX2hlaWdodC5sdChkZXBvc2l0LmV4cGlyeUhlaWdodCkpe3Rocm93IG5ldyBFcnJvcihcIkNhbiBub3QgdGFrZW91dCBiZWZvcmUgZXhwaXJ5SGVpZ2h0LlwiKTt9IGlmKGFtb3VudC5ndChkZXBvc2l0LmJhbGFuY2UpKXt0aHJvdyBuZXcgRXJyb3IoXCJJbnN1ZmZpY2llbnQgYmFsYW5jZS5cIik7fSB2YXIgcmVzdWx0PUJsb2NrY2hhaW4udHJhbnNmZXIoZnJvbSxhbW91bnQpO2lmKCFyZXN1bHQpe3Rocm93IG5ldyBFcnJvcihcInRyYW5zZmVyIGZhaWxlZC5cIik7fSBFdmVudC5UcmlnZ2VyKFwiQmFua1ZhdWx0XCIse1RyYW5zZmVyOntmcm9tOkJsb2NrY2hhaW4udHJhbnNhY3Rpb24udG8sdG86ZnJvbSx2YWx1ZTphbW91bnQudG9TdHJpbmcoKX19KTtkZXBvc2l0LmJhbGFuY2U9ZGVwb3NpdC5iYWxhbmNlLnN1YihhbW91bnQpO3RoaXMuYmFua1ZhdWx0LnB1dChmcm9tLGRlcG9zaXQpO30sYmFsYW5jZU9mOmZ1bmN0aW9uKCl7dmFyIGZyb209QmxvY2tjaGFpbi50cmFuc2FjdGlvbi5mcm9tO3JldHVybiB0aGlzLmJhbmtWYXVsdC5nZXQoZnJvbSk7fSx2ZXJpZnlBZGRyZXNzOmZ1bmN0aW9uKGFkZHJlc3Mpe3ZhciByZXN1bHQ9QmxvY2tjaGFpbi52ZXJpZnlBZGRyZXNzKGFkZHJlc3MpO3JldHVybnt2YWxpZDpyZXN1bHQ9PTA/ZmFsc2U6dHJ1ZX07fX07bW9kdWxlLmV4cG9ydHM9QmFua1ZhdWx0Q29udHJhY3Q7IiwiQXJncyI6IiJ9","gas_price":"1000000","gas_limit":"2000000","contract_address":"n1rVLTRxQEXscTgThmbTnn2NqdWFEKwpYUM","status":1,"gas_used":"22016"}}

如上所示,部署合約的交易的狀態變成了1,表示合約部署成功了。

執行智慧合約方法

在Nebulas中呼叫智慧合約的方式也很簡單,同樣是通過傳送交易來呼叫智慧合約。

呼叫智慧合約的save方法

> curl -i -H 'Accept: application/json' -X POST http://localhost:8685/v1/admin/transactionWithPassphrase -H 'Content-Type: application/json' -d '{"transaction":{"from":"n1LkDi2gGMqPrjYcczUiweyP4RxTB6Go1qS","to":"n1rVLTRxQEXscTgThmbTnn2NqdWFEKwpYUM", "value":"100","nonce":1,"gasPrice":"1000000","gasLimit":"2000000","contract":{"function":"save","args":"[0]"}}, "passphrase": "passphrase"}'

{"result":{"txhash":"5337f1051198b8ac57033fec98c7a55e8a001dbd293021ae92564d7528de3f84","contract_address":""}}
  • from: 使用者的賬戶地址
  • to: 智慧合約地址
  • value: 呼叫save()方法時想要存入智慧合約代幣數量
  • nonce: 比建立者當前的nonce多1,可以通過GetAccountState獲取建立前當前nonce
  • gasPrice:部署智慧合約用到的gasPrice,可以通過GetGasPrice獲取,或者使用預設值:"1000000"
  • gasLimit: 部署合約的gasLimit,通過EstimateGas可以獲取部署合約的gas消耗,不能使用預設值,也可以設定一個較大值,執行時以實際使用計算。
  • contract: 合約資訊,部署合約時傳入的引數
    • function: 呼叫合約方法
    • args: 合約方法引數,無引數為空字串,有引數時為JSON陣列

驗證智慧合約的方法save是否執行成功

由於執行合約方法本質是提交一個交易,所以我們可以通過驗證交易是否提交成功來判斷合約方法是否執行成功。

> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/user/getTransactionReceipt -d '{"hash":"5337f1051198b8ac57033fec98c7a55e8a001dbd293021ae92564d7528de3f84"}'

{"result":{"hash":"5337f1051198b8ac57033fec98c7a55e8a001dbd293021ae92564d7528de3f84","chainId":100,"from":"n1LkDi2gGMqPrjYcczUiweyP4RxTB6Go1qS","to":"n1rVLTRxQEXscTgThmbTnn2NqdWFEKwpYUM","value":"100","nonce":"1","timestamp":"1524712532","type":"call","data":"eyJGdW5jdGlvbiI6InNhdmUiLCJBcmdzIjoiWzBdIn0=","gas_price":"1000000","gas_limit":"2000000","contract_address":"","status":1,"gas_used":"20361"}}

如上所示,交易狀態變為了1,表示執行save方法成功了。

呼叫智慧合約的takeout方法

            
           

相關推薦

03 編寫執行智慧合約 ---》星雲開發

Nebulas 3200 萬獎金的 DApp 開發激勵計劃時間: 2018 年 5 月 7 日~ 7 月 2 日每提交一個有效 DApp 即可獲得 100 NAS ( 7000 元)會的話可以試試!專為咱們 Javascript 提供哈,返的獎金可平分返給你!QQ群交流:61

基於星雲智慧合約與Dapp(四)——編寫執行智慧合約

一般智慧合約需要以下幾個步驟: 1.編寫智慧合約 2.部署智慧合約 3.呼叫智慧合約,驗證合約執行結果 編寫智慧合約 Nebulas實現了NVM虛擬機器來執行智慧合約,NVM的實現使用了JavaScript V8引擎,所以我們可以使用JavaScr

區塊開發學習(二)--使用solidity編寫第一個智慧合約

上一篇講到如何安裝以太坊客戶端Geth,安裝好後很好奇如何往節點上部署一個合約,本文一起走一下流程; (1)登陸http://remix.ethereum.org/                remix 是

【區塊學習】以Linux為例,通過控制檯部署和執行智慧合約

安裝環境 安裝以太坊環境 (1) sudo apt-get install software-properties-common (2)sudo add-apt-repository -y ppa:ethereum/ethereum

04 智慧合約儲存區 --》星雲開發

Nebulas 3200 萬獎金的 DApp 開發激勵計劃時間: 2018 年 5 月 7 日~ 7 月 2 日每提交一個有效 DApp 即可獲得 100 NAS ( 7000 元)會的話可以試試!專為咱們 Javascript 提供哈,返的獎金可平分返給你!QQ群交流:61

java基礎(1)-----編寫執行第一個java程式

 下面是一個簡單的java程式,將在控制檯輸出hello world public class HelloWorld { public static void main(String[] args) { System.out.println("Hello Wor

編寫和測試智慧合約

1. 智慧合約是執行在以太坊上的程式。 使用Solidity語言開發智慧合約程式,還在測試,沒釋出1.0版本。   2. 智慧合約的編寫 和 類 相似。智慧合約程式碼如下: // 用來計算無符號證書的加減法 pragma solidity ^0.4.1; con

HyperLeger Fabric開發(六)——HyperLeger Fabric智慧合約碼)

HyperLeger Fabric開發(六)——HyperLeger Fabric智慧合約(ChainCode) 一、鏈碼(Chaincode)簡介 1、鏈碼簡介 在Fabric中,智慧合約也稱為鏈碼(chaincode),分為使用者鏈碼和系統鏈碼。系統鏈碼用來實現系統層面的功能,包括系統的配置,使用者

win10java配置環境變數,編寫執行“Hello world”程式

win10java配置環境變數,編寫Hello world程式 配置環境變數:滑鼠右鍵單擊此電腦選擇”屬性“,再選擇“高階系統設定”,於”高階“選項中點開“環境變數” 這裡寫圖片描述 (1)新建一個JAVA_HOME變數值為安裝路徑 這裡寫

java小白如何使用eclipse編寫執行一個HelloWorld程式

首先想要使用eclipse必須先安裝開發工具包JDK, 進入下載首頁後,點選下載JDK, 在這裡我們首先點選Accept License Agreement,接受許可協議(不接受許可協議是不能下載的哦!)。然後根據你電腦的系統選擇相應的作業系統,比如博主我的

第6課 用SI編寫"Hello World"智慧合約,開啟EOS之旅

1,摘要 【本文目標】 通過本文實踐,能夠使用SI(Source Insight)編輯EOS的智慧合約程式碼,並通過編譯,執行來測試"Hello World"程式碼。 【前置條件】 1) 已完成了EOS編譯,編譯測試成功; 2) 錢包,賬號已建立完畢; 錢包名

第一行程式碼:以太坊(3)-使用更多的工具編寫和測試智慧合約

在上文中已經使用了Remix環境執行和測試了本書編寫的第一個智慧合約程式,不過編寫和測試智慧合約的測試方式很多,例如,在testrpc環境測試;在Intellij IDEA整合開發環境中用Solidity語言編寫智慧合約;在純Web環境中測試智慧合約;使用AJAX方式測試智慧合約等。本文將詳細介紹這些

記事本編寫執行HelloWorld.java

準備工作: 安裝jdk並配置環境變數。 實現步驟: 步驟一(新建檔案):新建HellloWorld.txt並重命名為HelloWorld.java; 步驟二(編輯程式碼):在HelloWorld.java中編輯程式碼; public Class HelloW

ubuntu下編寫執行第一個c語言程式

對於初入Ubantu系統的小夥伴來說,進入Ubuntu最想做的事莫過於在終端(Terminal)裡執行自己的第一個C/C++程式"hello.c/hello.cpp"了。 Ubuntu預設是不包含編輯器vim和編譯器gcc。如果你是剛安裝好的Ubuntu電腦,下面我們將

如何利用記事本編寫執行一個java程式

1.下載jdk 可以在oracle官網下載: 注意選擇36位還是64位 下載以後按照步驟逐步安裝即可 但是要注意,在jdk和jre不可安裝到同一目錄,否則執行的時候找不到javac命令 這是因為j

編寫執行第一個Lisp程式

       我覺得接觸一門新的程式語言的時候第一個程式的編寫至關重要,這能夠讓我快速瞭解到簡單的語法以及執行方法。而執行方法基本上是我更為關注的,因為這將是後期學習過程中不斷打交道的東西。        為了能夠彌補工作中那種浪費時間的懊悔感,我決定學習一個新的程式語言,

在pycharm中方便地編寫執行robot framework測試用例

第二個最近更新的,就選了這個,並沒有說第一個比第二個差,有條件可以兩個都使用一下進行比較 安裝外掛 此次是基於windows平臺下的pycharm。我使用的是社群版。   開啟pycharm>點選File>點選setting>開啟Plugins>點

Hadoop基礎學習(一)分析、編寫執行WordCount詞頻統計程序

contains trace net tails super val 詞頻統計 上傳 str 版權聲明:本文為博主原創文章,未經博主同意不得轉載。 https://blog.csdn.ne

星雲開發dapp,賺取100nas(價值近萬)

sso 現在 wall tor github git 使用 完成 ava 前幾天星雲鏈主網正式上線,現在只要成功提交一個dapp即可獲得100nas,1個nas 75元人民幣左右。編寫合約只要會javascript就可以寫。活動持續兩個月左右。下面簡單介紹一下流程 首先

EOS智慧合約與DApp開發入門

EOS的是Block.One主導研發的一個區塊鏈底層公鏈系統,它專門為支撐商業去中心化 應用(Decentralized Application)而設計,其程式碼開源。 比特幣被稱為區塊鏈1.0,因為它開闢了數字加密貨幣的天下,走出了從0到1的決定性一步。 以太坊被稱為區塊鏈2.0,因為它提