如何开发编译部署调用智能合约

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 转码

智能合约编译,部署和运行

三、菜鸟实战

四、运行结果

1、编译

2、部署

3、运行

4、public 参数的查询函数


一、简介

如何创建一个带参数的智能合约

二、知识点

  • 智能合约

  • 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 参数,何为为我们提供了对应的查询函数,分别单击对应按钮,就可以调用对应的过程和看到对应的值

以上是关于如何开发编译部署调用智能合约的主要内容,如果未能解决你的问题,请参考以下文章

使用Nodejs部署智能合约

用Go来做以太坊开发④智能合约

用python如何实现智能合约?

智能合约场景下的模糊测试——智能合约基本介绍

rpc接口调用以太坊智能合约

Solidity智能合约开发 — 1-以太坊开发工具和部署