主页 > imtoken如何导入钱包 > HPB EVM合约介绍
HPB EVM合约介绍
1. 什么是合同?
合约是代码(其功能)和数据(其状态)的集合,位于以太坊区块链的特定地址。 合约账户能够在它们之间传递消息,并实际进行图灵完备的计算。 该合约以区块链为特色,并以以太坊特有的二进制格式生成,称为以太坊虚拟机 (EVM) 字节码。 现在HPB核心链在上层也采用了与ETH相同的架构。 本文介绍合约概念的基础知识!
合约通常是用Solidity等高级语言编写,然后编译成字节码上传到区块链。
还存在其他语言,特别是 Serpent 和 LLL,它们在本文档的以太坊高级语言部分有进一步描述。
Dapp 开发资源列出了集成开发环境、帮助您使用这些语言的开发人员工具,并提供测试和部署等功能。
2.EVM高级语言
最早的合约以以太坊特定的二进制格式(EVM 字节码)存在于区块链上,由以太坊虚拟机(EVM)执行。 然而,合约通常是用高级语言编写的,然后使用 EVM 编译器编译成字节码以部署到区块链。
以下是开发人员可以用来为以太坊编写智能合约的不同高级语言。
2.1 坚固性
Solidity 是一种类似于 JavaScript 的语言,允许您开发合约并编译为 EVM 字节码。 它是目前 EVM 开发的旗舰语言,也是最流行的语言。
Solidity 文档 - Solidity 是用于编写合约的旗舰以太坊高级语言。
Solidity在线实时编译器
标准化合约 API
Useful Ðapp Patterns - 对 Ðapp 开发有用的代码片段。
2.2 蛇
Serpent 是一种类似 Python 的语言,可用于开发合约并编译为 EVM 字节码。 它的目标是尽可能简洁,将低级语言的许多效率优势与编程风格的易用性相结合,同时为契约编程添加特殊的领域特性。 Serpent 是使用 LLL 编译的。
以太坊维基上的蛇
Serpent EVM 编译器
2.3 微光灯
类 Lisp 语言 (LLL) 是一种低级类汇编语言。 它意味着非常简单和简约; 基本上只是一个直接在 EVM 中编码的小包装器。
GitHub 中的 LIBLLL
LLL 的示例
2.4 Mutan(弃用)
Mutan 是一种静态类型的 C 语言,由 Jeffrey Wilcke 设计和开发,不再维护。
3. 制定合同
我们以 Hello World 合约为例。 在以太坊环境中运行,Solidity 没有明显的方式来“输出”串行。
contract HelloWorld {
event Print(string out);
function { Print("Hello, World!"); }
}
该合约将在区块链上创建一个打印类型的日志条目,参数为“Hello, world!” 每次执行时。
另见这些文件
Solidity 文档有大量关于如何编写合约的代码示例。
4. 编写合约
可靠性合同的编制可以通过多种机制来完成。
注意:
可以在此处找到有关已编译合约代码的更多信息。
4.1 在geth中设置solidity编译器
如果你启动一个 geth 节点,你可以检查哪些编译器可用。
> web3.eth.getCompilers;
["lll", "solidity", "serpent"]
此命令返回一个字符串数组,指示当前可用的编译器。
注意:
solc 编译器使用它来编译 cpp-ethereum。 或者,请参阅此示例自行构建。
如果您的 solc 可执行文件位于非标准位置,您可以使用 --solc 标志指定 solc 可执行文件的自定义路径。
$ geth --solc /usr/local/bin/solc
或者,您可以在运行时通过控制台设置此选项:
> admin.setSolc("/usr/local/bin/solc")
solc, the solidity compiler commandline interface
Version: 0.2.2-02bb315d/.-Darwin/appleclang/JIT linked to libethereum-1.2.0-8007cef0/.-Darwin/appleclang/JIT
path: /usr/local/bin/solc
4.2 编写一个简单的合约
让我们编译一个简单的合约代码:
> source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
这个合约提供了一个单一的方法 -> 乘法,用正整数 a 调用并返回 a*7,你就可以使用 eth.compile.solidity 在 geth JS 控制台中编译 solidity 代码了:
> contract = eth.compile.solidity(source).test
{
code: '605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056',
info: {
language: 'Solidity',
languageVersion: '0',
compilerVersion: '0.9.13',
abiDefinition: [{
constant: false,
inputs: [{
name: 'a',
type: 'uint256'
} ],
name: 'multiply',
outputs: [{
name: 'd',
type: 'uint256'
} ],
type: 'function'
} ],
userDoc: {
methods: {
}
},
developerDoc: {
methods: {
}
},
source: 'contract test { function multiply(uint a) returns(uint d) { return a * 7; } }'
}
}
注意:
编译器也可以通过 RPC 和 web3.javasdk 访问任何通过 RPC/IPC 连接到 geth 的浏览器 Ðapp。
以下示例显示如何通过 JSON-RPC 连接 geth 以使用编译器。
$ geth --datadir ~/eth/ --loglevel 6 --logtostderr=true --rpc --rpcport 8100 --rpccorsdomain '*' --mine console 2>> ~/eth/eth.log
$ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_compileSolidity","params":["contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"],"id":1}' http://127.0.0.1:8100
源代码的编译器输出将为您提供合约对象,每个对象代表一个合约。 eth.compile.solidity 的实际返回值是合约名称到合约对象对的映射。 由于我们的合约名称是 test,eth.compile.solidity(source).test 将为您提供一个包含以下字段的测试合约的合约对象:
编译的 EVM 字节码
编译器的附加元数据输出
源代码
编写合约的语言(Solidity、Serpent、LLL)
合同语言版本
编译合约时的Solidity编译器版本
应用程序二进制接口定义
用户手册NatSpec Doc
开发人员手册 NatSpec Doc。
编译器输出的结构(代码和信息)反映了两种不同的部署路径。 编译后的 EVM 代码通过合约创建交易发送到区块链,而其余(信息)理想情况下将作为可公开验证的元数据部署在去中心化云上如何在以太坊上部署智能合约,以补充区块链上的代码。
如果您的源代码包含多个合约,则输出将包含每个合约的条目,并且可以使用合约名称作为属性名称来检索相应的合约信息对象。 您可以通过检查最新的 GlobalRegistrar 代码来尝试:
contracts = eth.compile.solidity(globalRegistrarSrc)
5. 创建并部署合约
在开始这部分之前,请确保您有一个未锁定的帐户和一些资金。
现在您在区块链上创建合约作为一个空地址,并将上一节中的 EVM 代码作为数据创建。
如果使用这两个工具会更快:在线 Solidity 实时编译器或 Mix IDE
var primaryAddress = eth.accounts[0]
var abi = [{ constant: false, inputs: { name: 'a', type: 'uint256' } }]
var MyContract = eth.contract(abi)
var contract = MyContract.new(arg1, arg2, ..., {from: primaryAddress, data: evmByteCodeFromPreviousSection})
所有二进制数据都以十六进制形式序列化。 十六进制字符串总是以 0x 为前缀。
请注意如何在以太坊上部署智能合约,arg1、arg2、... 是合约构造函数的参数,以防它接受任何参数。 如果合约不需要任何构造函数参数,则可以省略这些参数。
值得指出的是,这一步需要你支付执行费用,一旦你的交易成为区块,你的账户余额(你作为from字段的发送者)将根据HPB EVM的GAS规则减少,一段时间后,你的交易应该出现在一个区块中,确认结果状态是一致的,你的合约现在存在于区块链上。
执行相同操作的异步方式如下所示:
MyContract.new([arg1, arg2, ...,]{from: primaryAccount, data: evmCode}, function(err, contract) {
if (!err && contract.address)
console.log(contract.address);
});
还没有
结束
对待
继续
本文由王小明博首发
HPB核心链官网
王小明
HPB芯链创始人,巴比特专栏作家。 十余年金融大数据和区块链技术开发经验,参与创建银联大数据。 创作区块链教学视频节目《名说》30余集,编写《以太坊官网文档中文版》,作为主要作者编写《区块链开发指南》,中国区块链社区ID“蓝莲花” “著名的。