Spectrum光谱链是由Ethereum以太坊的链发展而来,所以是完全兼容以太坊。
但是又有不同,主要是共识机制不同,二级架构layer2不同,更加兼容移动设备。
但是开发dapp涉及的工具和流程,以前开发以太坊的有哪些不一样,就需要仔细的区分一下了。
最上面的是表现层,这个是现在所有的互联网产品都具有的东西,比如说你做了一个网站,一个H5页面,甚至是做了一个APP,甚至是给开发者提供一些API或者是命令行的接口。在应用这一层下面是引入是智能合约的概念以及DApp。
这个是本文描述的终点,如何开发Spectrum的dapp?
简单来说三步走:
1,开发环境准备
2,智能合约工作流
3,DAPP构建和部署
不同的区块通过一些特定的方式连起来,就形成了区块链,区块链上每一个区块可以认为是编号,这个编号就是块高。
那怎么跟以太坊的网络是怎样交互呢?
拿现在我们比较熟悉的微信小程序举例,开发者可以通过微信小程序提供的特定框架、小程序的管理后台去创造小程序,普通用户可以在微信 APP 里面使用小程序。腾讯的服务器他本身是中心化的,只有腾讯自己去维护;对应到以太坊的网络里面,社区给开发者提供的工具很多,可以用 web3.js、web3j、web3.swift,也可用 etherscan,这些工具或者语言包通过某一个节点作为入口与以太坊网络交互,用户通过浏览 DApp 或者钱包来和网络交互。
以太坊除了主网之外然后还有三个测试网,它的主网我们可以理解为传统软件开发环境里面的线上环境,Rinkeby、Kovan 和 Ropsten 是三个测试网络。
区块链钱包,那比如说是像 imToken 或者是 Bitpie,还有后面我们要介绍的 Metamask,钱包和帐户之间有什么关系呢?
我们用这个我们现在所熟知的金融系统里面的钱包和帐户来类比一下,就比如说是我在招商银行和建设银行开了两三个帐户,那我有一个钱包装在我兜里面的,我实际上持有5张银行卡,对于区块链里面我安装了一个比特派钱包,这个钱包里面有以太坊的帐户和比特币的帐户,以太坊的帐户我可以有很多个,比特币的帐户也可以有很多个。
智能合约本质上是一个被代码控制的帐户,这个帐户本身和你在钱包里面所拥有的帐户是相同的,不同的是你所拥有的帐户的私钥掌握在你的手里,智能合约的则是掌握在合约部署者的手里。
在区块链世界里面我有一份智能合约源代码,可以部署到上面介绍的几个以太坊网络上面,每部署一次产生的合约实例都是不一样的,是完全不同的帐户,也是智能合约不能升级的原因。但是有些讨巧的方法可以完成合约的热更新。
智能合约的源代码大多数情况下是用 Solidity 编写的,spectrum也是。
开发环境准备
要有什么条件才可以开始呢?只有两个关键点:因为它是P2P网络,交易、合约部署都需要节点,就是说你需要有一个节点,然后任何活动都需要有帐户,即使说你调一个不花钱的合约方法也是需要帐户的。
光谱链开发遇到的问题?
1,目前只有自己搭私链,或者spectrum的公链,如何用Remix跟光谱的环境做交互?
2,如果是跑光谱链的测试网络节点。光谱链的测试币怎么申请?
在做DApp 测试的时候我们不需要去花费真金白银,可以使用不同的测试网提供的 faucet 给测试网的帐户充值,即把 ETH 充到 Metamask 钱包里面。以上就是准备开发环境的两个必要的条件,需要动手做的就是 Metamask、充值还有注册 infura.io。
3,本地开发调试可以使用 Ganache,方便地在本地起一个节点来处理交易,还有 Remix,它提供在浏览器内部的 JavaScript 测试网络。用Ganache好像无法跟光谱链做交互。
4,infura.io 则是为广大开发者提供以太坊区块链接入的服务,不过使用他需要我们有自己注册、自己管理钱包和帐户。光谱链好像没有这种提供节点数据接入的服务?
这二个必要条件是帐户和余额,因为以太坊上的任何操作都需要帐户才能够发起,所以我们需要创建钱包和帐户。我们开发的 DApp 是运行在浏览器里面的,对于 PC 端来说钱包最好是能和浏览器无缝集成的。目前社区中有个很好的选择是 Metamask,它实际上是一个浏览器插件。目前移动端还是没有必要的钱包。
Metamask天然是支持ETH的,如果用SMT充值需要开发一个SMT的Metamask,充值交易smt。
智能合约工作流:
目前做智能合约开发有两种方式,第一种是通过 Remix 在线 IDE ,这个 IDE 还算好用。还有就是自己搭建编译环境。
Remix 适合做我们快速的验证概念和原型,在 Remix中可以快速写合约代码,然后调用它的合约接口,测试它的行为,此外还可以测试已有的合约实例,我们可以从以太坊的线上环境和测试环境把合约实例加载到 Remix 里面然后测试,也可以通过 Remix 把合约部署到任何以太坊网络上面。Remix 还可用来做单步调试,当你发现合约某一些接口有奇怪问题的时候可以用 Remix 做单步调试。
Remix支持eth币的交易,不支持smt币的充值交易?
所以需要一套支持smt的智能合约编译工具。
合约在 Remix 里面的工作流?
在 Remix 里选 JavaScript VM,它是 Remix 提供的跑在浏览器内存里的一个测试网络,它的响应速度非常快,选择 JavaScript VM 之后默认这有几个帐户,里面的余额是 100 ETH,点击 Deploy 把合约部署一下,可以看到很快合约实例就有了,实例界面中红色的是合约接口,蓝色是合约属性。
智能合约的源代码编译,编译会产生字节码 ByteCode,这个是部署到测试网络时用的;以及接口声明 ABI,通过 ABI 实际业务代码就能知道这个合约到底暴露了哪些接口,每个接口接收参数的类型和数量。
里面用到了 web3.js,可以把 web3.js 理解为应用层的代码通向以太坊网络的一个桥梁。它作为桥梁的方式是可以使用很多不同的插件,在 web3 里面叫 Provider,我在浏览器当中运行时,Metamask也提供了一个插件;在本地的话,Ganache-cli 提供了一个插件;如果只想调用 infura.io 提供的入口节点,那可以通过 HTTP Provider。
合约部署所需要做的事情跟合约自动化测试时做的事情有很多相似的地方,不过部署的网络不是 Ganache-cli 提供的本地网络,而是 Rinkaby 测试网络,这里用到了一个插件,我们可以提供一个钱包的助记词,以及一个网络入口的节点,它通过 HTTP 的方式给节点发送消息进行交易。
DAPP构建和部署
DApp 和智能合约关键的交互就是两点,一个是读取合约数据,还有一个就是提交数据。
合约部署完之后,我们在以太坊的区块链上已经有一个我们可以直接与他交互的后端了,那接下来我们需要写的就是做这个应用层的代码和后端的交互,以及给DApp加上前端数据交互、读取的界面。
使用 web3 把我们的桥梁建起来,这里面我们假设使用这个 DApp 的用户安装了 Metamask,第二个关键的地方是我们新建这个合约的时候不像部署和编译脚本,传入了一个地址,这个不是完全新建的合约实例,而是从这个地址把这个合约加载进来。
最后真正要做出用户友好的 DApp,需要在这个基础上做很多的事情,比如说点击按钮并安装了这个 Metamask 的之后,用户的屏幕上马上就弹出了一个 Metamask 交易确认界面。
web3.js可以很好的支持smt的合约,所以综上dapp开发的主要障碍是目前缺少支持充值交易smt的开发工具。