链上智能合约 Dapp 系统开发部署搭建
合约是代码(它的功能)和数据(它的状态)的集合,存在于以太坊区块链的特定地址。合约账户能够在彼此之间传递信息,进行图灵完备的运算。合约依靠被称作以太坊虚拟机(EVM)字节代码(以太坊特有的二进制格式)上的区块链运行。链上智能合约 Dapp 系统开发搭建阿鹏:132..薇 4z77 掂 z558,链上智能合约 Dapp 系开发搭建
合约很典型地用诸如 Solidity 等高级语言写成,然后编译成字节代码上传到区块链上。
以太坊高级语言
合约依靠被称作以太坊虚拟机(EVM)字节代码(以太坊特有的二进制格式)上的区块链运行。然而,合约很典型地用诸如 Solidity 等高级语言写成,然后用以太坊虚拟机编译器编译成字节代码上传到区块链。
编译合约
solidity 合约的编译可以通过很多机制完成。
通过命令行使用 solc 编译器。
在 geth 或 eth 提供的 javascript 控制台使用 web3.eth.compile.solidity(这仍然需要安装 solc 编译器)。
在线 Solidity 实时编译器。
建立 solidity 合约的 Meteor dapp Cosmo。
Mix IDE。
以太坊钱包。
注意:关于 solc 和编译 Solidity 合约代码的更多信息可在此查看。
在 geth 设置 solidity 编译器
如果你启动了 geth 节点,就可以查看哪个编译器可用。
这一指令会返回到显示当前哪个编译器可用的字符串。
注意:solc 编译器和 cpp-ethereum 一起安装。或者,你可以自己创建。
如果你的 solc 可执行文件不在标准位置,可以用—solc 标志为 solc 可执行文件指定一个定制路线。
或者你可以通过控制台在执行期间设置这个选项:
编译一个简单合约
让我们编译一个简单的合约源:
这个合约提供了一个单一方法 multiply,它和一个正整数 a 调用并返回到 a*7。
注意:编译器通过 RPC 因此也能通过 web3.js,对浏览器内任何通过 RPC/IPC 连接到 geth 的Ðapp 可用。
下面的例子会向你展示如何通过 JSON-RPC 接合 geth 来使用编译器。
Code 编译的以太坊虚拟机字节代码
Info 从编译器输出的额外元数据
Source 源代码
Language 合约语言(Solidity,Serpent,LLL)
LanguageVersion 合约语言版本
compilerVersion 用于编译这个合约的 solidity 编译器版本。
abiDefinition 应用的二进制界面定义
userDoc 用户的 NatSpec Doc。
developerDoc 开发者的 NatSpec Doc。
编译器输出的直接结构化(到 code 和 info)反映了两种非常不同的部署路径。编译的以太坊虚拟机代码和一个合约创建交易被发送到区块,剩下的(info)在理想状态下会存活在去中心化云上,公开验证的元数据则执行区块链上的代码。
如果你的源包含多个合约,输出会包括每个合约一个入口,对应的合约信息对象可以用作为属性名称的合约名字检索到。你可以通过检测当前的 GlobalRegistrar 代码来试一下:
创建和部署合约
开始这一章节之前,确保你有解锁的账户和一些资金。你现在会在区块链上创建一个合约,方法是用上一章节的以太坊虚拟机代码作为数据给空地址发送交易。
注意:用在线 Solidity 实时编译器或 Mix IDE 程序会更容易完成。
所有的二进制数据都以十六进制的格式序列化。十六进制字符串总会有一个十六进制前缀 0x。
注意:注意 arg1,arg2,…是合约构造函数参数,以备它要接受参数。如果合约不需要构造函数参数,就可以忽略这些参数。
值得指出的是,这一步骤需要你支付执行。一旦交易成功进入到区块,你的账户余额(你作为发送方放在 from 领域)会根据以太坊虚拟机的 gas 规则被扣减。一段时间以后,你的交易会在一个区块中出现,确认它带来的状态是共识。你的合约现在存在于区块链上。以不同步的方式做同样的事看起来是这样:
与合约交互
与合约交互典型的做法是用诸如 eth.contract()功能的抽象层,它会返回到 javascript 对象,和所有可用的合约功能一起,作为可调用的 javascript 功能。描述合约可用功能的标准方式是 ABI 定义。这个对象是一个字符串,它描述了调用签名和每个可用合约功能的返回值。
现在 ABI 中具体说明的所有功能调用都在合约实例中可用。你可以用两种方法中的一种来调用这些合约实例上的方法。
当用 sendTransaction 被调用的时候,功能调用通过发送交易来执行。需要花费以太币来发送,调用会永久记录在区块链上。用这种方式进行的调用返回值是交易散表。
当用 call 被调用的时候,功能在以太坊虚拟机被本地执行,功能返回值和功能一起返回。用这种方式进行的调用不会记录在区块链上,因此也不会改变合约内部状态。这种调用方式被称为恒定功能调用。以这种方式进行的调用不花费以太币。
如果你只对返回值感兴趣,那么你应该用 call。如果你只关心合约状态的副作用,就应该用 sendTransaction。
在上面的例子中,不会产生副作用,因此 sendTransaction 只会烧 gas,增加宇宙的熵。
测试合约和交易
你通常需要低级的测试策略,为交易和合约排除故障。这一章节介绍了一些你可以用到的排错工作和做法。为了测试合约和交易而不产生实际的后果,你最好在私有区块链上测试。这可以通过配置一个替代网络 ID(选择一个特别的数字)和/或不能用的端点来实现。推荐做法是,为了测试你用一个替代数据目录和端口,这样就不会意外地和实时运行的节点冲突(假定用默认运行。
评论