电商公链CyberMiles入门指南
有朝壹日佑
发表于 2022-11-23 17:13:40
87
0
0
¬ 1.1简介
CyberMiles是CyberMiles 基金会开发的专为电商优化的公链,其愿景是建立一个全新的去中心化的电子商务生态系 统,鼓励每个人参与其中并尽情创新。
电商领域的传统特性是“赢者通吃”,大者恒大,一到两家最大的玩家主导市场,设定价格,获取大部分利润。如此 导致的后果便是:小企业和消费者损失惨重,整个行业创新脚步放缓。“赢者通吃”的原因在于强大的网络效应,拥 有最多数量买家和卖家的网络将获得胜利。时至今日,电商网络仍由大企业拥有和运作,是因为需要由一个中央 机构来验证交易,执行规则。而区块链技术则展示了去中心化的网络,在CyberMiles,“代码即法律”,区块链社区 的参与者据此来验证交易,执行规则。
¬ 1.2高级开发语言Lity及虚拟机CVM介绍
Lity语言由Solidity语言演化而来,向后完全兼容以太坊。Lity独特的设计使其更加灵活、具备前所未有的可扩展性,更 强大。重要的是,Lity语言比Solidity更安全,性能更好。
• 安全:CyberMiles分类提取了常见的以太坊Solidity智能合约安全问题,并在Lity语言编译器和虚拟机中对这些安全问题进行自动检查。Lity比现有的编程语言更安全。
• 高性能:通过库+以太坊原生接口(libENI),CyberMiles上的智能合约比传统以太坊智能合约运行速度大幅度加快(数万倍加速)并且手 续费也更低。
• 可扩展性强:社区可以去中心化地为常见电商场景、DApp和其他区块链定制优化的LibENI函数,这在区块链世界还是先例,如此,智能 合约的开发更加高效,虚拟机承载的功能也更多。
• 基于时钟的长期智能合约:基于时长,频率定义的事件,可以预先设定。这是现实商业世界不可或缺的工具,并且也是以太坊最明显的缺陷之一:缺少计时器功能。
第二节.入门
我们将讨论如何在您的计算机上创建和运行单个节点CyberMiles区块链。它允许您连接和测试基本功能,如硬币交易,放样和取消验证器,治理和智能合约。
2.1使用Docker
最简单的入门方法是使用我们的预构建Docker镜像。请确保您已 安装Docker并且Docker可以在没有sudo的情况下工作。
2.2 初始化
让我们首先初始化Travis构建的Docker image。
docker run --rm -v ~/volumes/local:/travis ywonline/travis node init --home /travis
节点的数据目录位于~/volumes/local本地计算机上。
2.3运行
现在,您可以在Docker中启动CyberMiles Travis节点。
docker run --name travis -v ~/volumes/local:/travis -t -p 26657:26657 -p 8545:8545 ywonline/travis node start --home /travis
此时,您可以按Ctrl-C退出终端,travis将继续在后台运行。您可以通过以下docker命令随时查看CyberMiles Travis节点的日志。
docker logs -f travis
您应该在日志中看到如下所示的块。
INFO [07-14|07:23:05] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=431.085μs mgasps=0.000 number=163 hash=05e16c…a06228
INFO [07-14|07:23:15] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=461.465μs mgasps=0.000 number=164 hash=933b97…0c340c
2.4连接
您可以通过附加Travis客户端的实例来连接到本地CyberMiles节点。
Get the IP address of the travis node
docker inspect -f ‘{{ .NetworkSettings.IPAddress }}’ travis
172.17.0.2
Use the IP address from above to connect
docker run --rm -it ywonline/travis attach http://172.17.0.2:8545
它打开web3-cmt JavaScript控制台以与虚拟机进行交互。下面的示例显示了如何解锁coinbase帐户,以便您可以使用token。
Welcome to the Travis JavaScript console!
instance: vm/v1.6.7-stable/linux-amd64/go1.9.3
coinbase: 0x7eff122b94897ea5b0e2a9abf47b86337fafebdc
at block: 231 (Sat, 14 Jul 2018 07:34:25 UTC)
datadir: /travis
modules: admin:1.0 cmt:1.0 eth:1.0 net:1.0 personal:1.0 rpc:1.0 web3:1.0
personal.unlockAccount(‘0x7eff122b94897ea5b0e2a9abf47b86337fafebdc’, ‘1234’)
true
3.源代码构建
目前,我们仅支持CentOS 7和Ubuntu 16.04 Linux发行版的源代码构建。
¬ 准备:您必须安装GO语言版本1.10+才能构建和运行Travis节点。获得GO 1.10的最简单方法是通过GVM。以下是Linux服务器上的命令。
$ bash
现在,我们可以构建和安装Travis二进制文件。它将填充其他配置文件~/.travis/
cd $GOPATH/src/github.com/CyberMiles/travis
make all
如果系统在最后一步找不到滑行,请确保您拥有$GOPATH/bin该$PATH变量。
¬ 运行
让我们使用~/.travis/数据目录在本地启动Travis节点。
travis node init
travis node start
¬ 连接
您可以通过附加Travis客户端的实例来连接到本地CyberMiles节点。
travis attach http://localhost:8545
它打开web3-cmt JavaScript控制台以与虚拟机进行交互。下面的示例显示了如何解锁coinbase帐户,以便您可以使用硬币。
Welcome to the Travis JavaScript console!
instance: vm/v1.6.7-stable/linux-amd64/go1.9.3
coinbase: 0x7eff122b94897ea5b0e2a9abf47b86337fafebdc
at block: 231 (Sat, 14 Jul 2018 07:34:25 UTC)
datadir: /travis
modules: admin:1.0 cmt:1.0 eth:1.0 net:1.0 personal:1.0 rpc:1.0 web3:1.0
personal.unlockAccount(‘0x7eff122b94897ea5b0e2a9abf47b86337fafebdc’, ‘1234’)
true
¬ 测试交易
您现在可以在以下帐户之间发送交易。
personal.unlockAccount(“from_address”)
cmt.sendTransaction({“from”: “from_address”, “to”: “to_address”, “value”: web3.toWei(0.001, “cmt”)})
接下来,您可以在>提示符下将以下脚本粘贴到Travis客户端控制台中。
function checkAllBalances() {
var totalBal = 0;
for (var acctNum in cmt.accounts) {
var acct = cmt.accounts[acctNum];
var acctBal = web3.fromWei(cmt.getBalance(acct), “cmt”);
totalBal += parseFloat(acctBal);
console.log(" cmt.accounts[" + acctNum + “]: \t” + acct + " \tbalance: " + acctBal + " CMT");
}
console.log(" Total balance: " + totalBal + “CMT”);
};
您现在可以在控制台中运行脚本,并查看结果。
checkAllBalances();
cmt.accounts[0]: 0x6…230 balance: 466.798526 CMT
cmt.accounts[1]: 0x6…244 balance: 1531 CMT
Total balance: 1997.798526CMT
第三节.部署Testnet节点
在本文档中,我们将讨论如何连接到CyberMiles Travis Testnet。我们将介绍Docker和“从源代码构建”方案。如果您不熟悉CyberMiles,则部署Docker节点可能更容易。
虽然我们强烈建议您运行自己的Travis节点,但您也可以要求直接访问由CyberMiles Foundation维护的其中一个节点。发送电子邮件至travis @ cybermiles .io申请访问凭证。您仍然需要travis来自Docker或源的客户端来访问节点。
¬ 4.1Docker:准备条件
4.1.1设置Docker
Docker image
Travis的Docker镜像存储在Docker Hub上。TestNet环境正在使用’最新’分支,可以从Travis自动提取:
$ docker pull ywonline/travis
注意:配置和数据将存储在容器中的/ travis目录中。该目录也将作为卷公开。端口8545,26656和26657将被暴露用于连接。
4.2获取Travis TestNet配置
从我们的Github仓库中查看Travis TestNet配置。将配置文件放在$HOME/.travis目录中:
$ cd
$ sudo rm -rf $HOME/.travis
$ git clone https://github.com/CyberMiles/testnet.git
$ cd testnet/travis
$ git pull
$ cp -r init $HOME/.travis
启动节点,并加入 Cyebrmiles TestNet
运行Travis应用程序:
$ travis node start --home ~/.travis
现在您的节点正在与TestNet同步,输出将如下所示。等到它完全同步。
INFO [07-20|03:13:26.229] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=1.002ms mgasps=0.000 number=3363 hash=4884c0…212e75 cache=2.22mB
I[07-20|03:13:26.241] Committed state module=state height=3363 txs=0 appHash=3E0C01B22217A46676897FCF2B91DB7398B34262
I[07-20|03:13:26.443] Executed block module=state height=3364 validTxs=0 invalidTxs=0
I[07-20|03:13:26.443] Updates to validators module=state updates="[{“address”:"",“pub_key”:“VPsUJ1Eb73tYPFhNjo/8YIWY9oxbnXyW+BDQsTSci2s=”,“power”:27065},{“address”:"",“pub_key”:“8k17vhQf+IcrmxBiftyccq6AAHAwcVmEr8GCHdTUnv4=”,“power”:27048},{“address”:"",“pub_key”:“PoDmSVZ/qUOEuiM38CtZvm2XuNmExR0JkXMM9P9UhLU=”,“power”:27048},{“address”:"",“pub_key”:“2Tl5oI35/+tljgDKzypt44rD1vjVHaWJFTBdVLsmcL4=”,“power”:27048}]"
要访问TestNet,请在seperte终端控制台中键入以下内容(确保单独的控制台也具有travis环境)
$ travis attach http://localhost:8545
您现在应该看到web3-cmt JavaScript控制台,现在可以测试一些交易。
4.3测试交易
在本节中,我们将使用travis客户端的web3-cmt JavaScript控制台发送一些事务并验证系统是否已正确设置。您无法测试事务,直到您与testnet完全同步。同步可能需要数小时。
¬ 5.创建一个测试账户
travis如上所述将节点附加到节点后,在TestNet上创建两个帐户。
Welcome to the Geth JavaScript console!
personal.newAccount()
…
现在你已经创建了两个账户0x1234FROM,并0x1234DEST在CyberMilesTestNet。是时候进行一些测试CMT了。请访问以下网站,并要求1000个testnet CMT帐户0x1234FROM。我们还会将由TEST智能合约发行的1000个TEST令牌发送到该帐户。
http://travis-faucet.cybermiles.io
5.2测试交易
您可以测试两个帐户之间的交易。请记住解锁两个帐户。
personal.unlockAccount(“0x1234FROM”,“password”)
true
…
cmt.sendTransaction({from:“0x1234FROM”, to:“0x1234DEST”,value:1000})
…
cmt.getBalance(“0x1234DEST”)
…
您还可以测试TEST令牌的智能合约交易,如下所示。
abi = [{“constant”:true,“inputs”:[],“name”:“name”,“outputs”:[{“name”:"",“type”:“string”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:"_spender",“type”:“address”},{“name”:"_value",“type”:“uint256”}],“name”:“approve”,“outputs”:[{“name”:"",“type”:“bool”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“totalSupply”,“outputs”:[{“name”:"",“type”:“uint256”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:"_from",“type”:“address”},{“name”:"_to",“type”:“address”},{“name”:"_value",“type”:“uint256”}],“name”:“transferFrom”,“outputs”:[{“name”:"",“type”:“bool”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“INITIAL_SUPPLY”,“outputs”:[{“name”:"",“type”:“uint256”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“decimals”,“outputs”:[{“name”:"",“type”:“uint256”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[],“name”:“unpause”,“outputs”:[],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“paused”,“outputs”:[{“name”:"",“type”:“bool”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:"_spender",“type”:“address”},{“name”:"_subtractedValue",“type”:“uint256”}],“name”:“decreaseApproval”,“outputs”:[{“name”:“success”,“type”:“bool”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:true,“inputs”:[{“name”:"_owner",“type”:“address”}],“name”:“balanceOf”,“outputs”:[{“name”:“balance”,“type”:“uint256”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[],“name”:“pause”,“outputs”:[],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“owner”,“outputs”:[{“name”:"",“type”:“address”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:true,“inputs”:[],“name”:“symbol”,“outputs”:[{“name”:"",“type”:“string”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:"_to",“type”:“address”},{“name”:"_value",“type”:“uint256”}],“name”:“transfer”,“outputs”:[{“name”:"",“type”:“bool”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:"_spender",“type”:“address”},{“name”:"_addedValue",“type”:“uint256”}],“name”:“increaseApproval”,“outputs”:[{“name”:“success”,“type”:“bool”}],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“constant”:true,“inputs”:[{“name”:"_owner",“type”:“address”},{“name”:"_spender",“type”:“address”}],“name”:“allowance”,“outputs”:[{“name”:"",“type”:“uint256”}],“payable”:false,“stateMutability”:“view”,“type”:“function”},{“constant”:false,“inputs”:[{“name”:“newOwner”,“type”:“address”}],“name”:“transferOwnership”,“outputs”:[],“payable”:false,“stateMutability”:“nonpayable”,“type”:“function”},{“inputs”:[],“payable”:false,“stateMutability”:“nonpayable”,“type”:“constructor”},{“anonymous”:false,“inputs”:[],“name”:“Pause”,“type”:“event”},{“anonymous”:false,“inputs”:[],“name”:“Unpause”,“type”:“event”},{“anonymous”:false,“inputs”:[{“indexed”:true,“name”:“previousOwner”,“type”:“address”},{“indexed”:true,“name”:“newOwner”,“type”:“address”}],“name”:“OwnershipTransferred”,“type”:“event”},{“anonymous”:false,“inputs”:[{“indexed”:true,“name”:“owner”,“type”:“address”},{“indexed”:true,“name”:“spender”,“type”:“address”},{“indexed”:false,“name”:“value”,“type”:“uint256”}],“name”:“Approval”,“type”:“event”},{“anonymous”:false,“inputs”:[{“indexed”:true,“name”:“from”,“type”:“address”},{“indexed”:true,“name”:“to”,“type”:“address”},{“indexed”:false,“name”:“value”,“type”:“uint256”}],“name”:“Transfer”,“type”:“event”}]
tokenContract = web3.cmt.contract(abi)
tokenInstance = tokenContract.at(“0xb6b29ef90120bec597939e0eda6b8a9164f75deb”)
tokenInstance.transfer.sendTransaction(“0x1234DEST”, 1000, {from: “0x1234FROM”})
10秒后,您可以按如下方式检查接收帐户的余额。
tokenInstance.balanceOf.call(“0x1234DEST”)
5.3免费交易
在CyberMiles区块链中,我们为大多数交易(重度用户或垃圾邮件发送者除外)免费提供。您可以在travis客户端控制台中尝试这样做。
cmt.sendTransaction({from:“0x1234FROM”, to:“0x1234DEST”,value:1000,gasPrice:0})
…
要尝试免费的基于智能合约的令牌交易,请在travis客户端控制台中使用以下内容。
tokenInstance.transfer.sendTransaction(“0x1234DEST”, 1000, {from: “0x1234FROM”, gasPrice: 0})
第四节.Transactions
CyberMiles区块链完全向后兼容以太坊协议。这意味着CyberMiles区块链支持所有以太坊交易。对于开发人员,我们建议您使用 web3-cmt.js库与区块链进行交互。该web3-cmt.js库是以太坊web3.js库的自定义版本,eth模块重命名为cmt模块。默认情况下,web3-cmt.js库已集成到travis客户端控制台中。
而,除了以太坊之外,特定于CyberMiles区块链的最重要的交易是用于DPoS放样操作和区块链治理操作。
放样
CyberMiles区块链的一个关键特征是DPoS共识机制。您可以阅读有关CyberMiles DPoS协议的更多信息 。通过赌注交易,CMT持有人可以宣布候选人的候选资格,赌注和投票给候选人,并根据需要取消赌注。了解有关验证器的放样交易和委托人的 放样交易的更多信息 。
治理
借助DPoS共识机制,CyberMiles验证器可以更改区块链网络的关键参数,部署新的libENI库,创建可信合同以及进行其他策略更改。区块链上的任何人都可以提出治理变更,但只有当前的验证人才能投票。了解有关治理事务的更多信息 。
成为第一个吐槽的人