区块链:建立加密代币

2023-11-09

启动testrpc

打开终端,启动testrpc

testrpc
EthereumJS TestRPC v6.0.3 (ganache-core: 2.0.2)
...
代币合约的基本概念

代币合约扮演的角色相当于银行的角色。使用者在代币合约中,用自己的以太币帐户地址当作银行帐户,可以透过代币合约执行转账(transfer,将代币由一个帐户转到另一个帐户),查询余额(balanceOf,查询指定帐户中拥有的代币)等原本由银行负责的工作。因为合约部署在公开区块链上,所有的交易都是公开透明,可供检验的。

创建代币合约项目
 cd /Users/mac/Desktop/GitHub/Solidity/learn/SmartContractDemo/EncryptedToken 
macdeiMac:EncryptedToken mac$ pwd /Users/mac/Desktop/GitHub/Solidity/learn/SmartContractDemo/EncryptedToken
/Users/mac/Desktop/GitHub/Solidity/learn/SmartContractDemo/EncryptedToken
macdeiMac:EncryptedToken mac$ truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:        truffle compile
  Migrate:        truffle migrate
  Test contracts: truffle test
macdeiMac:EncryptedToken mac$ 
新建代币合约

终端执行truffle create contract EncryptedToken命令创建EncryptedToken.sol合约。

macdeiMac:EncryptedToken mac$ truffle create contract EncryptedToken
macdeiMac:EncryptedToken mac$ 

这里写图片描述

编写合约代码

将下面的合约代码拷贝,替换EncryptedToken.sol文件的代码。

pragma solidity ^0.4.22;//代表solidity的版本

//contract相当于其他语言中的class,EncryptedToken相当于类的名字。
//contract EncryptedToken可以理解为class EncryptedToken extends Contract。
contract EncryptedToken {

  //声明了一个变量INITIAL_SUPPLY,初始化存储了一个666666的整数作为部署当前合约的钱包地址的代币数。
  uint256 INITIAL_SUPPLY = 666666;
  //balances是一个key类型为address,value类型为uint256的键值对(mapping),相当于Java中的map、iOS中的NSDictionary。
  mapping(address => uint256) balances;

  //EncryptedToken合约的构造函数(contructor),当EncryptedToken合约调用时,会先执行它的构造函数
  constructor() public{
    //以当前部署合约的钱包地址为key,以INITIAL_SUPPLY为value初始化一个键值对。
     balances[msg.sender] = INITIAL_SUPPLY;
  }

  // 转账到一个指定的地址
  /*
    param:address _to  转账的目的地地址
    param:uint256 _amount 转账金额
  */
  function transfer(address _to, uint256 _amount) public{
    //声明断言,当条件满足,即当前钱包余额小于要转账的额度时,就会抛出异常。
    assert(balances[msg.sender] < _amount);
    //从当前钱包额度中减去_amount
    balances[msg.sender] -= _amount;
    //将目标地址的额度增加_amount
    balances[_to] += _amount;
  }
  // 查看指定地址的余额
  /*
   param:address _owner 指定的钱包地址
   constant 关键字的作用 调用balanceOf函数时,它会自动调用call()方法
   表明只是读书数据,而不需要往区块链写入数据,调用这个方法,不需要花费手续费
  */
  function balanceOf(address _owner) public constant returns (uint256) {
    return balances[_owner];
  }
}
编译与部署

migrations/目录下创建一个名字叫做3_deploy_contract.js的文件。文件中的内容为:

var EncryptedToken = artifacts.require('./EncryptedToken.sol');

module.exports = function(deployer) {
  deployer.deploy(EncryptedToken);
}

这里写图片描述

修改truffle.js文件如下

module.exports = {
  networks:{
    development:{
      host:"localhost",
      port:8545,
      network_id:"*"//匹配任何netword id
    }
  }
};

接下来执行compile和migrate命令:

macdeiMac:EncryptedToken mac$ truffle compile
Compiling ./contracts/EncryptedToken.sol...
Compiling ./contracts/Migrations.sol...
Writing artifacts to ./build/contracts

macdeiMac:EncryptedToken mac$ truffle migrate
Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xb294a83d6af78566da598d005e35a0c1aff1c9b9aab6bad47c2a7c64c8f78548
  Migrations: 0xe32cf4c736d7eaed2e014f7922cc90e65291461a
Saving successful migration to network...
  ... 0xa4b7ffff3ae198a23b56aa79447811abc8073a877ce83a36c25638b10369cab9
Saving artifacts...
Running migration: 3_deploy_contract.js
  Deploying EncryptedToken...
  ... 0x472380c714b1331d6b62202f489009e8aeb34a82f5f60fdfa04fed191c1b42cd
  EncryptedToken: 0x87ef1502b36ec52e661091178b991211417815eb
Saving successful migration to network...
  ... 0x14cb8d7b4234d004b6d6e33a6524a4428e1d8f7202deb86556e2f37e6b21381d
Saving artifacts...
macdeiMac:EncryptedToken mac$ 

如上所示,我们已经将EncryptedToken代币合约部署到了testrpc上。

合约验证

合约部署完成后,我们通过truffle console开启console控制台,在这个控制台中对已经部署的合约进行验证。

macdeiMac:EncryptedToken mac$ truffle console
truffle(development)> web3.eth.coinbase
'0x62c806c5751e952352ed23c21ea63b92f4d37e49'
truffle(development)> web3.eth.accounts[0]
'0x62c806c5751e952352ed23c21ea63b92f4d37e49'
truffle(development)> web3.eth.accounts[1]
'0x2148c956ae0d20110abfc741f47cab1812cd7100'
truffle(development)> web3.eth.accounts[2]
'0x3bd3500477294891fae9ec0d07b96864f648668c'
truffle(development)> web3.eth.accounts[3]
'0x40dcf037cc9bd7008eb268a93002b8ee760467cb'
truffle(development)> web3.eth.accounts[9]
'0x5dce4583cdda41ea1720ea54defc0febf779aa18'
truffle(development)> 

这里写图片描述

testrpc启动时,系统会给我们分配10个钱包地址,如上图所示我们可以通过web3.eth.coinbase或者web3.eth.accounts[0]获取首个钱包地址,当然也可以根据索引获取其他的钱包地址。

接下来声明一个合约变量存储EncryptedToken合约实例。

let contract;
undefined
truffle(development)> EncryptedToken.deployed().then(instance => contract = instance)
....

验证web3.eth.coinbaseweb3.eth.accounts[1]中的余额。

truffle(development)> contract.balanceOf(web3.eth.coinbase)
BigNumber { s: 1, e: 5, c: [ 666666 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 0 ] }
truffle(development)> 

经验证,第0个钱包地址中的代币余额为666666,第1个钱包地址中的代币余额为0

下一步,我们将从第0个账号中向第1个账号转账666个代币。

truffle(development)> contract.transfer(web3.eth.accounts[1], 666)
Error: VM Exception while processing transaction: invalid opcode
    at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:509:1)
    at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:354:1)
    at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:64:1)
    at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/httpprovider.js:128:1)
    at /usr/local/lib/node_modules/truffle/build/webpack:/packages/truffle-provider/wrapper.js:134:1
    at /usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/requestmanager.js:86:1
    at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)
truffle(development)> 

如上所示,转账过程中出现了异常,转账失败,仔细检查一下,不难发现是因为在我们合约代码EncryptedToken.sol中有这么一句代码assert(balances[msg.sender] < _amount);,也就是说只有当balances[msg.sender] 小于_amount时,才不会出现异常,所以我们应该将<符号换成>符号,即当balances[msg.sender]余额不足时抛出异常。

这里写图片描述

代码修改后,需要重新编译,部署。

truffle(development)> .exit
macdeiMac:EncryptedToken mac$ pwd /Users/mac/Desktop/GitHub/Solidity/learn/SmartContractDemo/EncryptedToken 
/Users/mac/Desktop/GitHub/Solidity/learn/SmartContractDemo/EncryptedToken
macdeiMac:EncryptedToken mac$ ls
build           migrations      truffle-config.js
contracts       test            truffle.js
macdeiMac:EncryptedToken mac$ rm -rf build/
macdeiMac:EncryptedToken mac$ ls
contracts       test            truffle.js
migrations      truffle-config.js
macdeiMac:EncryptedToken mac$ truffle compile
Compiling ./contracts/EncryptedToken.sol...
Compiling ./contracts/Migrations.sol...
Writing artifacts to ./build/contracts

macdeiMac:EncryptedToken mac$ truffle compile
macdeiMac:EncryptedToken mac$ truffle migrate --reset
Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x06dc2459d1475eb3695046aecf69853a5d48118b083e7b35029e28608fc9a31e
  Migrations: 0x21784acbb71ea4ff918dcddfa6480ccd8dbd37f3
Saving successful migration to network...
  ... 0x1ee0008c47caa05a4e3c46fe74a1cf861db6cef360f89c42520dad0a7353447c
Saving artifacts...
Running migration: 3_deploy_contract.js
  Deploying EncryptedToken...
  ... 0x0b4755c4c54c3aaa35458d0f2032146e112a884f6c1564258e8a6cc4a7b858d6
  EncryptedToken: 0x428519366dbbf4f40f724a4270e60351e7550191
Saving successful migration to network...
  ... 0x161d89d9fe24bbd1bffc64585115519b5ed76c69a66929e63908b5fa086ef03e
Saving artifacts...
macdeiMac:EncryptedToken mac$ 

备注:编译时,一定要先将build文件夹删除,其次在部署合约时,一定要添加--reset,否则修改后的合约没法部署成功。

打开控制台,按照如下操作进行验证。

macdeiMac:EncryptedToken mac$ truffle console
truffle(development)> let contract
undefined
truffle(development)>  EncryptedToken.deployed().then(instance => contract = instance)
...
truffle(development)>  contract.balanceOf(web3.eth.coinbase)
BigNumber { s: 1, e: 5, c: [ 666666 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 0 ] }
truffle(development)> contract.transfer(web3.eth.accounts[1], 666)
{ tx: '0x3e864aa0b4509a6650dbd44115776e22e2ab3fb08620734ceef91a97d1cd2a43',
  receipt: 
   { transactionHash: '0x3e864aa0b4509a6650dbd44115776e22e2ab3fb08620734ceef91a97d1cd2a43',
     transactionIndex: 0,
     blockHash: '0x35feeaf4772df9abca434e2f9c5a60dcbb6d5bf9923f7d8dde6f109d768218ba',
     blockNumber: 10,
     gasUsed: 49083,
     cumulativeGasUsed: 49083,
     contractAddress: null,
     logs: [],
     status: 1 },
  logs: [] }
truffle(development)> contract.balanceOf(web3.eth.coinbase)
BigNumber { s: 1, e: 5, c: [ 666000 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 2, c: [ 666 ] }
truffle(development)> 

如上所示,代币转账成功。

简单介绍了代币系统的逻辑,并没有对安全进行相关操作,比如:余额不够的处理、地址合不合法的处理等等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区块链:建立加密代币 的相关文章

  • 声音识别的 ImageNet 诞生了

    转自 https www zhihu com question 56816282 answer 150639596 谷歌机器感知研究小组 Machine Perception Research 最新发布了一个大规模的音频数据集AudioSe
  • 存储器层次结构(一)

    存储器层次结构 一 目录 1 存储器层次结构 2 静态RAM 3 动态RAM 4 DRAM阵列 5 南北桥 6 磁盘 7 对扇区的访问时间 8 格式化的磁盘容量 9 操作系统执行读数据到主存的底层 10 读文件时间 11 适配器 12 固态
  • 实现51单片机按键按一下LED熄灭,再按一下LED亮起来的操作

    前言 完成51单片机基础的按键操作 实现按键按一下LED熄灭 再按一下LED亮起来的操作 一 完成51单片机基础的按键操作 实现按键按一下LED熄灭 再按一下LED亮起来的操作 include
  • Circle创立十年:从0到1000亿USDC流通量的愿景与思考

    原文标题 Why Circle CEO Jeremy Allaire Is So Optimistic About Stablecoins Future 原文作者 Laura Shin 原文来源 unchained 编译 Kaori Blo
  • 【华为OD】

    华为OD试题注意事项 使用合适的编程语言 在华为OD机试中多数情况下使用C 或Java 按照题目要求进行编码 仔细阅读题目描述并理解要求 在编码前可以进行伪代码编写或画流程图有助于理解和排除逻辑错误 注意代码的规范性 注重代码的可读性和可维

随机推荐

  • 服务器如何存储文件夹在哪,ecs云服务器如何存储文件夹

    ecs云服务器如何存储文件夹 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 按需购买的两台同类型弹性云服务器 操作系统类
  • 实用tcpdump命令 【转】

    文章来源 实用tcpdump命令 查看本机与mysql的操作命令 注意 i any表示监听所有网络接口 我们也根据自身情况选择网络接口 tcpdump i any w dst port 3306 strings 查看本机58895上与mys
  • 解决bug:Error creating bean with name 'webHandler' defined in class

    今天写代码 用到了 Spring Boot Admin 这是一个管理和监控的开源监控软件 但是今天一运行就报以下错误 Error creating bean with name webHandler defined in class wha
  • vue-message-simulate

    vue message simulate a light plugin of vue it simulates alert confrim model 依赖于sass 切 不支持ie9 一下的版本 使用如下 下载之后 在main js中 1
  • 如何在 Linux 中设置或更改系统主机名

    博学谷提供技术支持 主机名能帮助人们轻松的识别网络中的机器 单独运行hostname 不带任何参数 将返回 Linux 系统的当前主机名 如下所示 hostname TecMint 如果想更改 Linux 系统的主机名 只需运行 hostn
  • 测试用例设计-X云

    测试用例概述 测试用例设计方法 1 先对符合规则的设计一条用例 等价类方法 12个字符符合6 18个长度 不符合规则的 lt 6的字符 gt 18个字符 考虑边界值 我记得以前是考虑一个条件 另一个条件选有效等价类即可 这里考虑两个三件 那
  • java中String+String与StringBuilder的append()方法的效率问题

    因为上一次的A题过程中 发现String的 总是超时 后来用到了append 方法 就过了 发现两者的效率存在很大的区别 测试如下 public static void main String args TODO 自动生成的方法存根 Str
  • 无向图的深度优先遍历非递归_数据结构-图(图的基本实现C++)

    一 图的概念 图是一种比较复杂的非线性数据结构 图 Graph 是由顶点的有穷非空集合和顶点之间边的集合组成 通常表示为 G V E 其中 G表示一个图 V是图G中顶点的集合 E是图G中边的集合 图区分有向图和无向图 1 无向图 Undir
  • 编写程序,实现利用while循环和for循环属输出100以内偶数的功能。

    实现利用while循环属输出100以内偶数的功能 1 使用whlie编写 i 1 while i lt 100 i 1 if i 2 gt 0 continue print i end print 输出结果 2 4 6 8 10 12 14
  • 计算机科研立项应用类题目,《科研立项题目举例》.doc

    科研立项题目举例 计算机技术在其发展过程中形成两个重要分支 通用计算机领域 现在以Pc机为代表 着重发展海量高速数值运算技术 而其控制能力是有限的 嵌入式计算机领域 现在以单片机为代表 着重发展计算机的控制技术 而其计算机速度是有限的 在目
  • 小白学《HTML5网页开发实例详解》连载三(DOCTYPE和字符集)

    在2 1 2节中通过新老DOCTYPE的对比 读者可以清晰地看到HTML 5在精简旧有结构上做出的努力 DOCTYPE在出现之初主要用于XML中 用作描述XML允许使用的元素 属性和排列方式 起初HTML借鉴了XML中DOCTYPE的使用方
  • 使用OpenCV和Python生成视频条形码

    使用OpenCV和Python生成视频条形码 1 效果图 2 原理 2 1 步骤 2 2 项目结构 3 源码 参考 这篇博客将演示如何使用Python OpenCV生成视频条形码 生成视频条形码通常是出于设计美感 它不具有广泛的计算机视觉
  • 阿里云ECS FTP搭建

    阿里云ECS windows版 FTP服务设置教程 1 https www filezilla cn 去下载服务端和客户端并安装好 2 阿里云添加安全组 3 FileZilla服务端配置 4 FileZilla客户端使用端口10021连接服
  • AI巨浪下,数据技术如何驱动智能未来?

    引言 数据技术是大数据时代的核心驱动力 也是推动各行各业数字化转型和智能化升级的关键因素 随着云计算 人工智能 区块链等新兴技术的不断发展和融合 数据技术也呈现出多模态 混合处理 自动化管理等新的趋势和特点 8 月 19 日 周六 第八届
  • MongoDB:模糊查询、数量、结果插入新表、重复字段

    模糊查询 body中包含 db getCollection test find body regex 骗子 body或title中包含 db getCollection test find or body regex 骗子 title re
  • astype转换数据类型

    astype方法 通用函数 可以用于把dataframe中的任何列转换成其他类型 常见的数据类型有 int 整型 float 浮点型 object str 字符串 category 分类数据 import pandas as pd impo
  • Django基础知识整理之DRF框架

    文章目录 1 DRF框架简介 2 DRF特点 3 环境安装与配置 4 DRF牛刀小试 1 创建序列化器 2 编写视图 3 定义路由 4 运行测试 1 DRF框架简介 Django REST framework 框架是一个用于构建Web AP
  • Flutter的Toast之oktoast的使用

    1 在pubspec yaml中加入 oktoast 2 0 0 然后运行package get 2 包装 app widget 在main dart中 必须使用OKToast包起来 3 调用 如果只是Toast文字 可直接调用showTo
  • 阿里云的OSS云存储的使用

    阿里云官网 https www aliyun com 通过阿里云官网 登录进入用户的界面 在搜索框中输入OSS 然后进入阿里云的对象存储OSS的控制台 未开通的开通即可 创建 Bucket 点击 Bucket 列表 查看个人的Bucket
  • 区块链:建立加密代币

    启动testrpc 打开终端 启动testrpc testrpc EthereumJS TestRPC v6 0 3 ganache core 2 0 2 代币合约的基本概念 代币合约扮演的角色相当于银行的角色 使用者在代币合约中 用自己的