VNT:打造开发者友好的下一代公链基础设施

原标题:VNT:打造开发者友好的下一代公链基础设施

经过朋友推荐参加了VNT的全球开发大赛,VNT 全球开发大赛由区块链底层基础设施VNT Chain维特链联合云象区块链及多家知名院校、研究机构共同举办,面向全球邀请开发者共同参与。

VNT是新一代国产公链,架构上借鉴了Ethereum、EOS等主流公链。同时使用Web Assembly作为虚拟机的底层。具体可以参见VNT 白皮书。这里着重介绍一下开发上的体验。

C语言智能合约

以太坊的智能合约被誉为区块链2.0的里程碑,其采用Solidity编程语言,运行在以太坊虚拟机EVM上。但是Solidity语言存在一些问题:

1、局限性:接触该语言的程序员较少,同时Solidity只开放一些接口,表达力有限;

2、安全性:根据研究论文《Finding The Greedy, Prodigal, and Suicidal Contractsat Scale》,智能合约有87%的概率含有漏洞。

VNT Chain采用Web Assembly(WASM)来执行智能合约语言,它是苹果、谷歌、微软同时支持的一种语言标准。WASM会生成中间语言:字节码,字节码既可以编译成机器码后执行,又可以使用解释器直接执行。

只要有合适的编译器支持,理论上任何高级语言都可以编译成WASM字节码程序。这可以降低开发人员的学习成本,除此之外,WASM还具有以下优点:

1、性能高效:指令精简,在程序执行过程中性能优越;

2、存储成本低:相对于文本格式,二进制编码的文本占用的存储空间更小;

3、多语言支持:用户可以使用C/C++/RUST等多种语言编写智能合约并编译成WASM格式的字节码。

VNT Chain还将通过以下几个方面对WASM进行优化,使其具备更强的安全性与可用性:

1、改造原生WASM中多线程、浮点数、异常处理等导致计算非确定性的设计,确保计算的确定性;

2、增加燃料(Gas)机制,解决了智能合约中的停机问题;

3、提供沙箱运行环境,实现资源隔离,保障系统的安全性;

4、支持形式化验证,保证合约安全性。

基于对WASM语言的应用以及优化改造,VNT Chain的智能合约模块具备优越的兼容性与性能,同时拥有安全性与灵活性。

尤其是VNT Chain首创的形式化自我验证能力编程语言,将语言本身的类型系统与数学定理系统结合,并将语言的类型验证与形式化验证结合,为智能合约形式化安全验证提供强有力的支持。

VNT Chain通过安全、可靠、面向大众的智能合约设计,将吸引更多的开发者,为赋能分布式经济而努力。不同于以太坊,目前VNT使用高级语言C语言作为智能合约的编程语言,拥有更强的表达力与第三方生态。

在VNT合约中,使用关键字Key修饰状态变量来表明区块链中的可持久化数据。例如,可以用下面的代码描述一段数据结构,用来记录某个地址持有了多少数量的Token。

KEY struct {

address addr;

uint256 u256;

} s1 = {Address("0xaaaaaa11"), U256(10000000000011)};

和Solidity相似,VNT的合约也有Payable功能,表示其是否可以接收来自交易中的原生代币。通过在函数名称前加上$符号来表示,更加的简洁⽣动。

智能合约中最重要的设计就是合约间的调用。VNT设计了一种Call机制来支持跨合约的访问,访问的对象为合约中可被外部访问的函数。利用这种设计,可以实现嵌套层级之间的合约之间的通信。

//contract a,用于被调用

MUTABLE

uint32 test(int32 var1,string var2){

...

}

//contract b,调用contract a

//声明CALL

CALL uint32 test(CallParams params,int32 var1,string var2);

MUTABLE

uint32 testcall(){

CallParams prams = {Address("0xaaaa"), U256(10000), 100000};

uint32 res = test(prams, 1, "string");

...

}

官方也提供了一个猜数游戏的教程

Bottle命令行工具

说完了合约语言,再来看一下合约的编译和部署。这里官方提供了一组Go语言的命令行工具,效果类似eosio.cdt,语法则类似Truffle。

Bottle提供的的命令行参数如下:

NAME:

bottle - the bottle command line interface

Copyright 2018-2019 The bottle Authors

USAGE:

bottle [global options] command [command options] [arguments11...]

VERSION:

0.6.0-beta-1e52fa2f

COMMANDS:

build Build contracts

compile Compile contract source file

compress Compress wasm and abi file

decompress Deompress file into wasm and abi file

hint Contract hint

init Initialize dapp project

migrate Run migrations to deploy contracts

help, h Shows a list of commands or help for one command

PATH OPTIONS:

--code value Specific a contract code path

--include Specific the head file directory need by contract

--output Specific a output directory path

--file value Specific a compress file path to decompress

--abi value Specific a abi path needed by contract

--wasm value Specific a wasm path

MIGRATE OPTIONS:

--reset Run all migrations from the beginning, instead of running from the last completed migration

-f value Run contracts from a specific migration. The number refers to the prefix of the migration file (default: 0)

-t value Run contracts to a specific migration. The number refers to the prefix of the migration file (default: 0)

--network value Specify the network to use, saving artifacts specific to that network. Network name must exist in the configuration

--verbose-rpc Log communication between bottle and the VNTChain client

GLOBAL OPTIONS:

--help, -h show help

而部署合约到Testnet或者Mainnet的方法,则类似使用Truffle。

// Deploy a single contract without constructor arguments

deployer.deploy(A);

// Deploy a single contract with constructor arguments

deployer.deploy(A, arg1, arg2, ...);

// Don't deploy this contract if it has already been deployed

deployer.deploy(A, {overwrite: false});

// Set a maximum amount of gas and from address for the deployment

deployer.deploy(A, {gas: 4612388, from: "0x...."});

// External dependency example:

//

// For this example, our dependency provides an address when we're deploying to the

// live network, but not for any other networks like testing and development.

// When we're deploying to the live network we want it to use that address, but in

// testing and development we need to deploy a version of our own. Instead of writing

// a bunch of conditionals, we can simply use the overwrite key.

deployer.deploy(SomeDependency, {overwrite: false});

因此还可以使用这个工具进行调试与单元测试。

var ERC20 = artifacts.require("../contracts/Erc20.c")

module.exports = function (deployer, a) {

deployer.deploy(ERC20, "1000000", "bitcoin", "BTC").then(function (instance) {

deploy = instance;

return deploy.GetTotalSupply()

}).then(function (totalSupply) {

console.log("totalSupply", totalSupply.toString());

return deploy.GetDecimals();

}).then(function (decimals) {

console.log("decimals", decimals.toString());

return deploy.GetTokenName();

}).then(function (tokenName) {

console.log("tokenName", tokenName);

return deploy.GetAmount("0x122369f04f32269598789998de33e3d56e2c507a")

}).then(function (balance) {

console.log("balance", balance.toString());

})

};

小结

目前VNT Chain融合了公有链的分布式价值流转特性以及联盟链的商业属性,构建起由公有链(Hubble Network)、联盟链(Galileo Network)及跨链(Kepler Route)组成的聚合链架构。并且也于近日完成了主网上线,期待可以在上面孵化出一类新的区块链应用。

所谓工欲善其事,必先利其器,在有了这些基础设施之后,开发者需要认真地探讨,区块链的核心规则、逻辑、公平性、概率,这些哪些应该上链,如何上链,如何建立属于Web3.0时代的商业模式。

开发者需要思考,如何利用公链给自己的应用赋能,利用云计算平台搭建测试环境,最后,形成一个不只是博彩、游戏,而更多的是“刚需”场景的、真正可商业应用的底层公链。

这些都是非常迫切的问题,深入的讨论非常有利于行业的长远发展。

(文章作者:仙女座科技CEO唐飞虎)

密码极客是一群来自前阿里、蚂蚁金服的技术人员与阿里创业帮一起发起的区块链技术创投社群,也是杭州最大的区块链技术创业社群,截止8月,社群技术人员超过2000位,社群成员超过10万。返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
免费获取
今日搜狐热点
今日推荐