如何开发编译部署调用智能合约
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何开发编译部署调用智能合约相关的知识,希望对你有一定的参考价值。
参考技术A 在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个特殊地址。uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为 uint (256bits无符号整数)。你可以认为它就像数据库里面的一个存储单元,跟管理数据库一样,可以通过调用函数查询和修改它。在以太坊中,通常只有合约 的拥有者才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。跟很多其他语言一样,访问状态变量时,不需要在前面增加 this. 这样的前缀。
这个合约还无法做很多事情(受限于以太坊的基础设施),仅仅是允许任何人储存一个数字。而且世界上任何一个人都可以来存取这个数字,缺少一个(可靠 的)方式来保护你发布的数字。任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如 何增加一个存取限制,使得只有你才能修改这个数字。
代币的例子
接下来的合约将实现一个形式最简单的加密货币。空中取币不再是一个魔术,当然只有创建合约的人才能做这件事情(想用其他货币发行模式也很简单,只是实现细节上的差异)。而且任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。
注意
对于在线solidity环境来说,这不是一个好的例子。如果你使用在线solidity环境 来尝试这个例子。调用函数时,将无法改变from的地址。所以你只能扮演铸币者的角色,可以铸造货币并发送给其他人,而无法扮演其他人的角色。这点在线 solidity环境将来会做改进。 参考技术B
我们使用solc库来编译合约代码。如果你还记得的话,之前我们提到过 web3js库, 它能够让你通过 RPC 与区块链进行交互。我们将在node控制台里用这个库编译和部署合约, 并与区块链进行交互。
首先,请确保ganache已经在第一个终端窗口中运行:~$ ganache-cli。
然后,在另一个终端中进入repo/chapter1目录,启动node 控制台,然后初始化 web3 对象,并向本地区块 链节点(http://localhost:8545)查询获取所有的账户:
~$ cd ~/repo/chapter1
~/repo/chapter1$ node
> Web3 = require('web3')
> web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
> web3.eth.accounts
['0x5c252a0c0475f9711b56ab160a1999729eccce97''0x353d310bed379b2d1df3b727645e200997016ba3''0xa3ddc09b5e49d654a43e161cae3f865261cabd23''0xa8a188c6d97ec8cf905cc1dd1cd318e887249ec5''0xc0aa5f8b79db71335dacc7cd116f357d7ecd2798''0xda695959ff85f0581ca924e549567390a0034058''0xd4ee63452555a87048dcfe2a039208d113323790''0xc60c8a7b752d38e35e0359e25a2e0f6692b10d14''0xba7ec95286334e8634e89760fab8d2ec1226bf42''0x208e02303fe29be3698732e92ca32b88d80a2d36']
要编译合约,首先需要载入 Voting.sol文件的内容,然后使用编译器(solc)的compile()方法 对合约代码进行编译:
> code = fs.readFileSync('Voting.sol').toString()> solc = require('solc')> compiledCode = solc.compile(code)
成功编译合约后可以查看一下编译结果。直接在控制台输入:
> compiledCode
相当长一大段输出霸屏...
便以结果是一个JSON对象,其中包含两个重要的字段:
compiledCode.contracts[':Voting'].bytecode: 投票合约编译后的字节码,也是要部署到区块链上的代码。
compiledCode.contracts[':Voting'].interface: 投票合约的接口,被称为应用二进制接口(ABI:Application Binary Interface), 它声明了合约中包含的接口方法。无论何时需要跟一个合约进行交互,都需要该合约的abi定义。你可以在 这里查看ABI的详细信息。
在接下来的几节课,我们将会使用truffle框架来管理合约的编译过程以及与区块链的交互过程。但是, 在使用框架之前,深入了解其工作原理还是大有裨益的,因为框架会将这些脏活封装起来,在出现 故障时并不容易排查错误。
以上内容来自:以太坊DApp开发入门教程
区块链实战如何创建一个带参数的智能合约
目录
一、简介
如何创建一个带参数的智能合约
二、知识点
智能合约
Solidity 公共变量
Solidity 私有变量
以太坊椭圆曲线算法 keccak256
abi 转码
智能合约编译,部署和运行
三、菜鸟实战
// SPDX-License-Identifier: GPL-3.0
// Author: 菜鸟实战
// Description: 智能合约如何传递参数
// 编译器版本
pragma solidity >=0.7.0 <0.9.0;
// 知识点
// # 智能合约
// # Solidity 公共变量
// # Solidity 私有变量
// # 以太坊椭圆曲线算法 keccak256
// # abi 转码
// # 智能合约编译,部署和运行
// 合约名称
contract VarAction
// public 变量会自动提供查询方法
string public VarName;
int256 public VarAge;
bytes32 public VarHash;
// 私有变量
uint256 VarYear;
constructor(string memory _name, int256 _age, uint256 _year) public
VarName = _name;
VarAge = _age;
VarYear = _year;
VarHash = keccak256(abi.encode(VarName, VarAge, VarYear));
四、运行结果
1、编译
2、部署
由于这个合约有参数,所以在部署的时候传入参数
3、运行
4、public 参数的查询函数
对于 public 参数,何为为我们提供了对应的查询函数,分别单击对应按钮,就可以调用对应的过程和看到对应的值
以上是关于如何开发编译部署调用智能合约的主要内容,如果未能解决你的问题,请参考以下文章