Nebulas一個新的JavaScript開發智慧合約平臺
Nebulas是另一個可以開發智慧合約的平臺。它提供了一種使用JavaScript開發智慧合約的方法,這是一種有趣的替代方案,可替代更為成熟的解決方案,例如以太坊。
我第一次在Reddit上宣讀了Nebulas獎勵計劃,該計劃獎勵開發人員成功提交dApp(去中心化應用程式)。從Nebulas的白皮書中,我們可以瞭解團隊的動機以及他們為dApp提供搜尋引擎和排名演算法的目標。聽起來很熟悉?讓我谷歌那個。哦,這聽起來像谷歌。
通過瀏覽 白皮書 ,你瞭解到Nebulas認識到“區塊鏈上應用程式的價值衡量”問題以及使用區塊鏈進行升級和升級的平臺的難度。
這不是一個評論,我既不想也不想足夠的知識來評估這個專案解決的問題,如上所述,是否值得投入你的時間或金錢。我對開發人員的經驗,從工程角度提供工具的質量感到興趣,並瞭解它與成熟的以太坊相比如何。如果我們的目標是內聯的,那麼這是一個值得一讀的帖子。
以太坊虛擬機器和Nebulas虛擬機器
一般而言,如果你熟悉以太坊的工作原理,瞭解Nebulas虛擬機器(NVM)以及平臺如何工作是輕而易舉的。提供的氣體本質上綁定了以太坊虛擬機器(EVM)和NVM上的計算。交易費用是使用的gas,乘以gas價格。
有兩種型別的帳戶:外部/非合約帳戶和智慧合約(相應地用型別87和88表示)。
curl -X POST \ http://localhost:8685/v1/user/accountstate \ -H 'content-type: application/json' \ -d '{ "address": "n1Vg9Ngvi3vXo5f59diW4MK8XXger36weUm" }' {"result":{"balance":"1000000000000000000","nonce":"0","type":87}}
在當前連線的節點上本地執行的呼叫是免費的,立即返回值並且不更改區塊鏈狀態。
curl -X POST \ http://localhost:8685/v1/user/call \ -H 'content-type: application/json' \ -d '{ "from": "n1QA4usgq7sJbcM5LEkJWpgyNBcKtVEULFf", "to": "n1mQoB6HneRuu7c15Sy79CPHv8rhkNQinJe", "value": "0", "gasPrice": "1000000", "gasLimit": "2000000", "contract": { "function": "myView", "args": "[100]" } } ' { "result": { "result": "{\"key\":\"value\"}", "execute_err": "", "estimate_gas": "20126" } }
每筆交易都會耗費gas並改變區塊鏈狀態(在撰寫本文時,它的價格便宜且只佔一小部分)。
curl -X POST \ http://localhost:8685/v1/admin/transactionWithPassphrase \ -H 'content-type: application/json' \ -d '{ "transaction": { "from": "n1Vg9Ngvi3vXo5f59diW4MK8XXger36weUm", "to": "n1gQgDb72yL1vrRcUEP3219ytcZGxEmcc9u", "value": "0", "nonce": 59, "gasPrice": "1000000", "gasLimit": "2000000", "contract": { "function": "myMethod", "args": "" } }, "passphrase": "passphrase" } ' { "result": { "txhash": "36a61c6413e71387f34b0b442e73d2a8b54646917c58338166b0473292c0b26d", "contract_address": "" } }
最明顯的區別是用於開發智慧合約的程式語言。在EVM上,Solidity是編寫智慧合約的事實上的標準語言。在目前的形式中,NVM支援JavaScript(v8 6.2,從我發現的內容)和準TypeScript,雖然編譯為JS。沒有可用於儲存,交易或其他全域性可用物件的型別。
由於支援LLVM的計劃,我們可能會看到更廣泛的受支援語言,例如C/C++,Go,Solidity或Haskell。如果Nebulas團隊能夠實現這一承諾並且非常失望,這將是一個非常重要的特徵。
智慧合約
讓我們深入探討在以太坊(Solidity)和Nebulas(JavaScript)中如何實現相同的結構。
轉賬
以太坊和Nebulas都具有最小的名義值,稱為wei。1個ETH或1個NAS是10^18Wei。傳遞函式接受的值應為Wei的數量。在以太坊的情況下,它是uint256,對於Nebulas,它應該是BigNumber的一個例項。
address(address).transfer(value);
Blockchain.transfer(address, value);
交易屬性
交易屬性存在於全域性名稱空間中,並提供有關鏈的高度,塊時間戳,供應的氣體等的一組資訊。
msg.sender// sender address (address) msg.value// number of Wei sent (uint256) block.timestamp// current block timestamp (uint256)
Blockchain.transaction.from// sender address (string) Blockchain.transaction.value// number of Wei sent (string) Blockchain.block.timestamp// current block timestamp (number)
使用混合大小寫校驗和編碼可以進行以太坊地址驗證,如 EIP55 所述,Vitalik Buterin的提議。錢包軟體已廣泛採用這種改進。由於使用了20位元組的地址型別,因此無法使用此方法在鏈上驗證它。Nebulas的地址有點不同;你可以從公鑰計算校驗和。它還包含有關地址是常規帳戶還是智慧合約的資訊。
Blockchain.verifyAddress(address);
防止溢位
JavaScript中的最大安全整數是2 ^ 53 - 1. Solidity中的最大安全整數(無符號)甚至更大:2 ^ 256 - 1.在某些特定用例中,可能會溢位(或下溢)這些值。 要降低可能源自溢位的任何問題的嚴重性,你可以使用第三方庫。
uint max = 2**256 - 1; // 115792089237316195423570985008687907853269984665640564039457584007913129639935 max + 1; // 0
在Solidity中,你可以使用流行的SafeMath庫,它會丟擲錯誤,消耗掉下溢或溢位時留下的所有氣體。
import "github.com/OpenZeppelin/openzeppelin-solidity/contracts/math/SafeMath.sol"; using SafeMath for uint256; uint max = 2**256 - 1; max.add(1); // VM error
我們在Nebulas上執行的JavaScript驅動的智慧合約可以使用bignumber.js而無需任何額外的匯入。
const BigNumber = require("bignumber.js"); Number.MAX_SAFE_INTEGER;// 9007199254740991 Number.MAX_SAFE_INTEGER + 1; // 9007199254740992 Number.MAX_SAFE_INTEGER + 2; // 9007199254740992 const number = new BigNumber(Number.MAX_SAFE_INTEGER); number.plus(2).toString();// "9007199254740993"
合約結構
Solidity是一種面向聯絡的語言。這意味著它是一種面向物件的語言,帶有一個contract關鍵字,用於定義類似類的型別,能夠通過函式儲存狀態併為此狀態提供行為。
contract Crowdsale is MintedCrowdsale, CappedCrowdsale { constructor(uint256 _rate, address _wallet, ERC20 _token) public { // ... } function () public payable { buyTokens(msg.sender); } function buyTokens(address _beneficiary) public payable { // ... } }
此外,Solidity還支援介面和類似Python的多重繼承(通過C3超類線性化)。
在Nebulas上,合約是一個類(或函式),其原型上有可用的方法。在合約初始化期間需要並執行一個函式 init
;它接受合約建立期間傳遞的引數。
class StandardToken { init() { // ... } } module.exports = StandardToken;
狀態變數
如果不將事件日誌計為第四種,則Solidity有三種類型的儲存:儲存,記憶體和堆疊。儲存保持合約狀態變數。
contract Ownable { address owner; constructor() public { owner = msg.owner; } }
Nebulas在其儲存功能之上提供抽象。使用 LocalContractStorage
,我們必須指出哪些變數應該顯式保留。
class Ownable { constructor() { LocalContractStorage.defineProperty(this, "storage"); } init() { this.owner = Blockchain.transaction.from; } }
Visibility
Solidity有四個可見性說明符:public,private,external和internal。公共說明符允許外部和內部呼叫,而私有函式只能從定義它們的合約中呼叫。內部函式像私有函式一樣工作,但擴充套件合約也可以呼叫它們。外部函式可由其他合約和交易呼叫,也可在內部使用 this
關鍵字呼叫。
contract Visibility { function visible() pure public {} function hiddenFromOthers() pure private {} function visibleOnlyForFunctions() pure external {} function visibleForChildContracts() pure internal {} }
在Nebulas上,私有函式是通過命名約定實現的,而不是由語言強制實現的。所有以下劃線開頭的函式都不是介面的一部分,不能通過交易呼叫。
class Visibility { function visible() { this._hidden(); } function _hidden() {} }
客戶端應用程式
以太坊dApp使用注入的web3例項與嵌入式提供程式,每次dApp嘗試簽署交易時都會要求使用者進行確認。MetaMask是你的瀏覽器的以太坊擴充套件,支援此流程,以及Mist和Status(帶有適用於桌面和移動裝置的dApps瀏覽器的錢包應用程式)。
使用Nebulas dApps時,你可以安裝 WebExtensionWallet 。它缺乏方便的web3抽象,但它對於PoC和簡單的用例來說已經足夠了。傳送交易的API與直接使用RPC非常相似。實際上,直接使用RPC是進行不需要簽名的呼叫的最簡單方法。
部署
在以太坊中部署合約有多種方法。最適合開發人員的是Remix和Truffle遷移指令碼。Nebulas在 其網路錢包 中提供類似Mist的體驗。你複製並貼上合約原始碼,指定建構函式引數,然後你就可以了。
或者,你可以將合約源更改為轉義字串併發送交易,該交易 使用RPC 建立新合約。
測試
由於其不可變性和代價高昂的錯誤,測試是智慧合約開發中最重要的部分之一。Nebulas生態系統處於起步階段,沒有任何工具可以進行此類測試。雖然笨拙,但測試Nebulas智慧合約並非不可能。 它需要模擬內部API,但是,一旦你下定決心,你將或多或少地可靠地測試合約。
在Solidity中測試智慧合約 要容易得多。由於Truffle團隊的努力,你幾乎可以在Solidity和JavaScript中單獨可靠地測試合約。
pragma solidity 0.4.24; import "truffle/Assert.sol"; import "../contracts/Ownable.sol"; contract OwnableTest { Ownable ownable; function beforeEach() public { ownable = new Ownable(); } function testConstructor() public { Assert.equal(ownable.owner(), address(this), "owner address is invalid"); } // ... }
結論
坦率地說,自2017年中期以來,我認為Lisk將成為JavaScript智慧合約的第一個平臺。Nebulas讓我感到驚訝。
當然,Nebulas無法與更成熟的以太坊生態系統相匹敵,但是提出更好的比較並不是這裡的目標。我認為新專案應該更加溫和一點,並且要提前做好自己的缺點。我最初的失望只是因為當時的鉅額索賠。
當我退後一步時,很明顯,Nebulas團隊在過去幾個月裡取得了相當大的進步。我相信這是一個值得觀察的專案,我希望釋放主網不是為時過早,並且不會因為其他類似的專案而放慢開發速度。
======================================================================
分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:
- java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
- EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- tendermint區塊鏈開發詳解 ,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裡是 Nebulas一個新的JavaScript開發智慧合約平臺