c++区块链实例_区块链研究实验室| HyperLedger Fabric架构构建ERC20令牌 part I

b0d938efc9235cab305ec4b89b7150e6.png

由于其高TPS和作为区块链作为服务平台的行为,许多新创新者正在选择Hyperledger来部署他们的区块链业务。因此,在本博客中,我们将讨论使用node.js在Hyperledger中创建基于erc20的令牌链代码的方法。

为何选择ERC20?

ERC20是以太坊广泛测试和接受的,将其整合到Hyperledger中,可以轻松地为基于Hyperledger的任何令牌编写安全且可扩展的链码。

我们将在本教程中参考以下开源存储库。

注意:我们假设您已经熟悉Hyperledger结构,并且您的系统配备了启动Hyperledger开发的先决条件。如果没有,请参阅Hyperledger文档中的先决条件、关键概念和教程。

此存储库中的代码已在以下环境中进行了测试:

  1. node:v8.9.3和v8.11.4
  2. Hyperledger:v1.2
  3. Docker:18.06.1-ce
  4. Python:2.7.12
  5. Go:go1.9.3 linux / amd64
  6. curl:7.47.0

我们建议在适应代码的同时使用相同的版本。

确保先决条件安装正确后,请执行以下步骤:

cd path/to/repository/folder
cd network

进入网络文件夹后,即可创建超级账本网络环境。 它将分别为您创建2个组织(Org1和Org2),Orderer每个组织有2个对等组。

Housekeeping

如果这是您第二次运行本教程,或者您已成功运行任何其他基于HyperLedger Fabric的代码,那么我们建议您首先运行以下命令:

./buildERC20TokenNetwork.sh down

它将要求确认:

Stopping for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n]

按Y并继续。

注意:您可以使用以下命令检查Docker有多少个容器或卷正在运行:

  • docker ps
  • docker volume ls

如果使用脚本很难关闭容器和卷,请尝试运行以下命令:

  • docker network prune
  • docker volume prune
  • docker rm -f $(docker ps -aq)

令牌网络设置

完成Housekeeping后,您就可以使用以下命令启动网络了:

16b201d029282971bcea93d7041ba0f0.png

执行可能需要一些时间(通常在90到120秒之间执行)。 但是,如果您在终端中看到以下日志,则表示它已成功执行,您的网络已准备就绪。

875f0295ad2ca8f7193ece862df1182d.png

使用crypto-config.yaml文件在您的网络目录中名为crypto-config的文件夹中为HyperLedger的每个实体创建了所需的证书。

创建了channel.tx,genesis.block,Org1MSPanchors.tx和Org1MSPanchors.tx。

它还为以下内容创建了Docker容器和卷:

  • peer0 and peer1 or Org1
  • peer0 and peer1 of Org2
  • orderer
  • CLI
  • chaincode

使用docker ps和docker volume ls检查它们。 我们还在Org1和Org2之间创建了一个频道名称mychannel,每个组织的同伴都是该频道的一部分。 然后在每个组织的peer0上安装我们的链代码并实例化我们的链代码,命名为mycc。 您可以使用以下方法查看相应对等/链代码的日志:

docker logs <peer identity> // type peer and then tab to see your options
docker logs <chaincode identity> // type dev and then tab to see your options

注意:对于调试,您可以访问您的链代码和对等日志docker logs <按TAB查看选项>; 如果您没有看到链代码的容器(dev-peer0.org1.techracers.com-mycc-1.0),那么实例化我们的令牌链代码就会出现问题。

我们的代币

现在我们的chaincode已经启动并运行,让我们尝试一些getter和setter函数来更好地理解它。为此,我们需要输入我们创建的cli容器。

docker exec -it cli bash

你将会看到以下结果:

root@0e2b84a5cedc:/opt/gopath/src/github.com/hyperledger/fabric/peer#

getter函数

一旦进入了cli,就可以调用simpletoken中提供的getter函数。我们将逐一讨论您可以访问的每一个:

获得所有权人

此函数将返回令牌合同的所有者。现在是MSPID实例化了契约,您可以在这里看到它。

peer chaincode query -C mychannel -n mycc -c '{"Args":["getOwner"]}'
Org1MSP

这里,mychannel是我们的通道名称,mycc是我们的chaincode的名称,如您所见,org1msp是我们chaincode的当前所有者。

getName

此函数将返回令牌合同的名称。它在实例化合同时被设置为简单令牌,您可以在这里看到它。

peer chaincode query -C mychannel -n mycc -c '{"Args":["getName"]}'
Simple Token

如您所见,Simple Token是我们当前的令牌名称。

getSymbol

此函数将返回我们的令牌合约的符号。 在实例化合同时将其设置为SMT,您可以在此处查看

peer chaincode query -C mychannel -n mycc -c '{"Args":["getSymbol"]}'
SMT

如您所见,SMT是我们当前的令牌符号。

getTotalSupply

此函数将返回令牌合同的总供应量。在设置之前,它默认为0。您可以在这里找到所需的逻辑。

peer chaincode query -C mychannel -n mycc -c '{"Args":["getTotalSupply"]}'
0

如你所见,0是我们目前的总供应量。

isMintingAllowed

此getter返回存储在Hyperledger上的IsMintingAllowed布尔值。它默认为未定义,直到设置一次。您可以在这里找到所需的逻辑。

peer chaincode query -C mychannel -n mycc -c '{"Args":["isMintingAllowed"]}'
undefined

正如你所看到的,isMintingAllowed现在是未定义的。 一旦稍后设置,它将返回true或false。

getAllowance

此getter返回令牌所有者为Spender MSPID设置的津贴值。它将“input the mspid token”owner作为第一个参数,将“mspid of spender”作为第二个参数。在设置之前,它默认为0。

peer chaincode query -C mychannel -n mycc -c '{"Args":["getAllowance", "Org1MSP", "Org2MSP"]}'
0

如你所见,getallowance现在是0。稍后设置后,它将返回float。我们还要检查一下还有没有其他组合,看看它是否返回0。

peer chaincode query -C mychannel -n mycc -c '{"Args":["getAllowance", "Org2MSP", "Org1MSP"]}'
0

getBalanceOf

最后一个getter是getbalanceof函数,它返回我们输入的每个mspid的令牌平衡。如果mspid没有任何令牌平衡,它也默认为0。

ac8cf5025c382f7145099b931712b583.png

本文转载公众号:区块链研究实验室,专注区块链技术,产品社群,经济模型等全方位的知识体系输出,为大家带来不一样的社群学习体验。加入作者社群:csschan1120

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ERC20代币合约中的`toggle`函数是用于切换是否需要签名的函数。如果该函数被调用,那么代币转移交易就不需要经过用户的签名确认,而是直接由智能合约执行。这种方式可以用于一些特殊场景,比如允许信任的第三方执行代币转移交易,或者在某些情况下需要快速执行代币转移交易等。 使用Toggle函数需要满足以下条件: 1. 合约的owner需要调用该函数进行切换。 2. 调用该函数需要提供owner的签名,以验证调用者的身份。 以下是一个使用Toggle函数的示例: ``` // 假设以下变量已经定义并初始化 // ERC20代币合约的地址 address tokenAddress = 0x1234567890123456789012345678901234567890; // 合约owner的地址和私钥 address ownerAddress = 0x1122334455667788990011223344556677889900; bytes32 ownerPrivateKey = "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; // 实例ERC20代币合约 ERC20 token = ERC20(tokenAddress); // 调用Toggle函数 function toggleSign() public { // 判断是否为owner require(msg.sender == ownerAddress); // 构造toggle函数的参数 bytes4 funcSig = bytes4(keccak256("toggle()")); bytes memory data = abi.encodeWithSelector(funcSig); // 对参数进行签名 bytes32 hash = keccak256(abi.encodePacked(address(this), data)); bytes memory sig = eth_sign(ownerPrivateKey, hash); // 构造调用参数 bytes memory payload = abi.encodePacked(data, sig); // 调用ERC20代币合约的方法 (bool success, ) = token.call(payload); require(success, "Toggle failed"); } // 对参数进行签名的函数 function eth_sign(bytes32 privateKey, bytes32 hash) private pure returns (bytes memory) { bytes32 r; bytes32 s; uint8 v; (r, s, v) = ecrecover(hash, 27, privateKey); bytes memory sig = new bytes(65); assembly { mstore(add(sig, 32), r) mstore(add(sig, 64), s) mstore8(add(sig, 96), add(v, 27)) } return sig; } ``` 在上述示例中,我们首先实例化了ERC20代币合约,然后定义了一个toggleSign函数,用于调用Toggle函数。在toggleSign函数中,我们首先判断调用者是否为owner,然后构造Toggle函数的参数,并对参数进行签名。最后,我们将签名后的参数和Toggle函数的selector合并,构造调用参数,然后调用ERC20代币合约的方法。在调用Toggle函数时,如果签名验证通过,那么代币转移交易就可以不需要经过用户的签名确认,直接由智能合约执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值