首页
壁纸
关于
发现大佬
Search
1
XBOX土耳其阿根廷购买教程
4,075 阅读
2
Oculus Quest2 无线投屏到PC
2,883 阅读
3
openwrt路由器安装uu加速器插件
2,000 阅读
4
xiaomi 小米pad 5 pro adb 删除自带app 系统精简 (非root)
1,560 阅读
5
Xbox Series X / S 开箱~~~~激动无比
1,325 阅读
学习
QuantumultX
JavaScript
web3
react
Solidity
雅思
Azure
游戏
随笔
登录
/
注册
Search
标签搜索
javascript
XSX
js
游戏
xbox
css
游戏截图
Xbox Series X
刺客信条
刺客信条英灵殿
web3
雅思
学习
IELTS
英语
教程
Xbox Series S
Steam
截图
leetcode
Arthur
累计撰写
109
篇文章
累计收到
104
条评论
首页
栏目
学习
QuantumultX
JavaScript
web3
react
Solidity
雅思
Azure
游戏
随笔
页面
壁纸
关于
发现大佬
搜索到
1
篇与
智能合约
的结果
2022-01-11
智能合约部署教程 如何部署一个智能合约
学习以太坊智能合约不仅仅是学习一门新的编程语言Solidity,更是学习如何使用高效的开发工具、如何进行完整的测试。 使用Solidity编译器和Geth 控制台手动部署一份智能合约。 什么是智能合约 智能合约就是一组规则和规则指导下的数据的合体。相当于一个后端代码+数据库。 智能合约是代码编写的合同 智能合约的条款由代码来指定,代码的逻辑缜密远超普通文字描述。 智能合约的存储、部署在公开的以太坊链条上,天然具有公开、透明的性质。任何人都可以随时公开查询一个合约的状态。 智能合约的安全性由去中心化网络保证,产生的交易数据也在区块链上永久存储和追溯,无法抵赖,安全性远超由中央节点控制的条款类程序。 智能合约有强制性、自动性,无需人工干预,当条件满足时仅需触发,就能自行完成相应操作,如转账扣款或者变更库存数量等。 安装编译器 同安装 Geth一样,我们通过Homebrew包管理器来安装 solc。 按顺序执行下面的命令 brew tap ethereum/ethereum brew install solidity 安装成功后查看版本 solc --version Solc编译智能合约 这里推荐solidity插件 先准备一个简单的智能合约 pragma solidity ^0.8.11; contract Vault { uint vaultData; function set(uint data) public{ vaultData = data; } function get() public view returns (uint) { return vaultData; } } 简单解释一下各个部分。智能合约的名字是Vault,是一个存储合约,它开辟一个存储区 vaultData,该存储区是一个 uint 类型的变量(unsigned int,正整数)。智能合约一共包含两个方法:set 与get。分别为设置 vaultData 的值和读取 vaultData 的值。整个合约不会产生事件,所以也不会产生日志。合约指定需要编译器版本 0.8.11 来进行编译 我们来到控制台,执行以下命令编译该智能合约: solc --optimize --combined-json abi,bin Vault.sol 输出结果为 {"contracts":{"Vault.sol:Vault":{"abi":[{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"data","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bin":"6080604052348015600f57600080fd5b5060ac8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806360fe47b11460375780636d4ce63c146049575b600080fd5b60476042366004605e565b600055565b005b60005460405190815260200160405180910390f35b600060208284031215606f57600080fd5b503591905056fea2646970667358221220e326564e4c5c8bf8ab243fd9bdd4af546d2e1e65128f376b4d7707e0d2aa670c64736f6c634300080b0033"}},"version":"0.8.11+commit.d7f03943.Darwin.appleclang"} 我们将该编译结果放入一份 temp.js 文件中并重新排版。 var output = {"contracts":{"Vault.sol:Vault":{"abi":[{"inputs":[],"name":"get","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"data","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"}],"bin":"6080604052348015600f57600080fd5b5060ac8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806360fe47b11460375780636d4ce63c146049575b600080fd5b60476042366004605e565b600055565b005b60005460405190815260200160405180910390f35b600060208284031215606f57600080fd5b503591905056fea2646970667358221220e326564e4c5c8bf8ab243fd9bdd4af546d2e1e65128f376b4d7707e0d2aa670c64736f6c634300080b0033"}},"version":"0.8.11+commit.d7f03943.Darwin.appleclang"} 格式化以后 var output = { "contracts": { "Vault.sol:Vault": { "abi": [ { "inputs": [], "name": "get", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "data", "type": "uint256" } ], "name": "set", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], "bin": "6080604052348015600f57600080fd5b5060ac8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806360fe47b11460375780636d4ce63c146049575b600080fd5b60476042366004605e565b600055565b005b60005460405190815260200160405180910390f35b600060208284031215606f57600080fd5b503591905056fea2646970667358221220e326564e4c5c8bf8ab243fd9bdd4af546d2e1e65128f376b4d7707e0d2aa670c64736f6c634300080b0033" } }, "version": "0.8.11+commit.d7f03943.Darwin.appleclang" } 提取其中的ABI { "inputs": [], "name": "get", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "data", "type": "uint256" } ], "name": "set", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ABI 代表了一份“说明书”,展示了对于我们生成的合约究竟可以进行哪些操作、操作的参数又是哪些。 在编译期我们就已经确定了参数类型和函数名称,不存在动态类型。我们研读这份ABI 的总体结构,是一个列表。 列表里共2个项目:名为 get 的方法与 名为 set 的方法,其中 set 方法接受一个 uinit256 的参数, 名为 data( uint256 即256位的 uint,在solidity中与 uint 同义); get 方法不接受 任何的参数,但是输出一个结果为 uint256 的值,且返回值不命名。 下面对ABI 中常见的几个关键字进行解释 名称 解释 type 接口类型,默认为function,也可以是construnctor、fallback等 name 方法名字 inputs 接口输入参数列表,每一项都是参数名+参数类型 outputs 接口输出结果列表,每一项都是返回值名+返回值类型 constant 布尔值,若为true 则该接口不修改合约存储区,是只读方法 payable 布尔值,标明该方法是否接受以太币 stateMutability 枚举类型,为下列选项之一: pure:表明该方法只读不修改存储,且不读取区块链状态 view:表明该方法只读不修改存储,但读取区块链状态 nonpayable:该方法不能接受以太币 payable:该方法可以接受以太币 第二部分是 bin 也就是经过编译器优化过后的可运行的合约字节码。真正部署到区块链上的是 bin 这一部分的代码,这部分代码的内容是初始化代码,包含了如何清理空间、创建变量、初始化合约的指令。 文章来源
2022年01月11日
194 阅读
0 评论
0 点赞