我拒绝用5个CMT买一瓶矿泉水,选择体验这场魅力十足的workshop——智能合约最初三分钟

在CyberMiles开发者社区的Workshop中,参与者利用5个CMT学习编写智能合约,从HelloWorld到竞猜游戏,亲身体验了区块链的魅力。活动不仅教授了如何使用MetaMaskforCMT进行账户管理和CMT转账,还展示了智能合约的编写、部署及应用,让参与者深入理解了Codeislaw的概念。

用5个CMT(CybeiMiles草莓糖)可以做什么?

很悲伤的消息是,在币圈大凉的环境下,按照现在的币价来算,只能买一瓶矿泉水。

但是这5个CMT 在开发人员手里,大有用处!究竟能够发挥了什么作用,来CyberMiles开发者社区11月25日举办的 2小时学会编写智能合约Workshop101 看看。

 

Hello World

Hello world 是最简单的程序之一,也是大部分程序员编写的第一个程序。这次的 workshop 101 也是从最基础的Hello world智能合约开始。

这里要特别指出,Hello World 部分的主讲人杨乐。她是CyberMiles 的产品经理,毕业于香港大学英文文学系。与这次来参会的大多数人一样,她在此之前,没有任何编程经验。只要你愿意,欢迎来到开发者社区小课堂的讲台哟。

说回正题,在正式部署执行Hello world智能合约之前,我们需要在电脑上安装MetaMask for CMT。这是一个安装在Chrome 浏览器的钱包工具,它的主要功能是管理 CyberMiles 帐号私钥,实现从网页上直接支付 CMTs (包括gas 费)等功能。

安装过程比较简单,去官网 https://www.cybermiles.io/metamask 下载插件,之后在Chrome的扩展程序中打开开发者模式,将下载好的 metamask4cmt.crx 拖拽至Chrome 的扩展程序页面。

拖拽后,如果Metamask for CMT 不能正常工作,可以试下重启浏览器。如果依然不能正常工作,来参加workshop 的程序员提供了一个新的方法,非常厉害,当天拯救了不少人的电脑。

把下载好的metamask4cmt.crx 的后缀改成.rar,进行解压。在Chrome 扩展程序页面,点击 “加载已解压的扩展程序”,添加解压好的metamask4cmt.crx 就可以了。

此外,如果Chrome 中已经安装了其他版本的MetaMask,为了不影响使用,最好暂时停止使用其他版本的MetaMask,只留Metamask for CMT激活。

安装好MetaMask for CMT,就可以生成一个新的 CyberMiles 帐号来存储 CMTs,在最上方选择Main CyberMiles Network。因为主办方会给每个人发5个真实的CMT,用于支付执行智能合约的gas 费以及参与后面的神秘环节。

CMT的转账速度非常快,差不多10秒就到账了,并且不用支付gas费,转账体验非常好!

有了5个CMT和MetaMask for CMT,就可以开始我们的Hello World!

在 Chrome 里打开Remix for CMT的网页,将写好的Hello World智能合约代码放进中间的代码编辑区,当然,你也可以选择自己写代码。

之后点击右侧的 Start to compile, 编译器会自动检查这段代码是否存在常规性错误。没有问题的话,编译器会自动识别出该段合约的名称,也就是 Contract 后面的Greet。如果有问题,编译器会给出提示,根据提示修改代码,再次编译即可。

检查代码没有问题后,就可以把Greet智能合约部署到 CyberMiles 区块链了。点击右侧最上方的Run,然后点击Deploy。这时需要调用MetaMask for CMT 支付部署智能合约所需要的gas 费。

一般情况下,MetaMask 的支付页面会自动跳出,点击 Submit 进行支付就可以了。如果没有自动跳出,手动点击插件就好了。可以看到,部署这个合约上链只需要花费0.000489个CMT。

支付完gas 费后,右下方Deployed Contracts 处就可以看到,我们的合约已经在CyberMiles 链上部署好了。

红色的terminate 可以终止这个合约,但只有合约owner 才可以执行这项操作,终止合约同样需要支持少量gas 费。

greet 显示智能合约的内容是什么,在这里是Hello World。当然,Hello World 这个词只是程序员的选择。作为智能合约的开发者,你可以让 greet() 返回任何字符 — 可以是一首歌,一篇文章,一本书,或者是一段加密的文字。

owner 显示这个合约的所有权归哪个地址所有。你为这个合约支付部署gas费的账号地址就是合约的所有者。

同时用区块浏览器 CMTTracking.io 查询交易地址信息,可以看到刚刚创建的合约地址。如果你的朋友有这个合约地址,在 At Address 栏内输入合约地址,点击At Address 就可以收到别致的智能合约问候啦!


我们上面看见怎么用Hello World智能合约在区块链存一段话,并让世界上任何人看见这段话。那么,这是怎么在代码里实现的呢?

pragma lity ^1.2.4;

这是智能合约所用的代码语言及版本。

contract Greet {
  function greet() {
  }
  function terminate() {
  }
}

以上代码介绍了智能合约的名字Greet,以及两个功能,greet和terminate。

 address public owner;
    modifier onlyOwner() {
        assert(msg.sender == owner);
        _;
    }
    constructor () public {
        owner = msg.sender;
    }

以上的代码设置了合约的owner,owner的地址信息是公开的。信息发送者,也就是谁支付了gas费,让合约能够部署到链上,谁就是owner,并且定义了只有owner能够修改这个合约。

 function greet() public pure returns (string) {
      return "Hello world";
  }

以上代码表明当你调用greet()时,就会出现 Hello World。这个功能只是从区块链上读取数据,所以不需要 gas 费用。这里你可以把 Hello World 改成任何文字。

  function terminate() external onlyOwner {
    selfdestruct(owner);
  }

这就是智能合约最开始定义的terminate 终止合约的功能,并且定义了只有Owner可以执行这项功能。selfdestruct是析构函数,用于销毁数据,终止合约。

到这里,Hello World的代码就结束了,这是一段非常完整的代码。

这个最基础的合约既设置了合约的Owner,同时也设置了Owner 能够销毁合约,当执行selfdesruct时,合约里的钱也会返还给Owner。

因为合约地址与钱包地址长地非常像,并且长度也一致,如果不小心把币打到了合约地址,一般情况下,是无法找回的。但如果你知道合约的owner是谁,可以联系合约的owner,在销毁合约时拿回你的资产。

这只是个人的小损失,如果项目方没有认真地对待代码,带来的资产损失是非常严重的。非常典型的案例是,今年7月份,Polkadot 有超过513,774.16 ETH 被冻结在Parity钱包中,就是因为合约中的 owner 被人设成 null 了,因此没有人可以终止合约,拿回存在合约里的钱。现在,钱仍然被锁在合约里,没有人可以拿回来。

谨慎对待,认真审查每一段代码,尤其是涉及到钱的代码,这是每个程序员该有的素质。
CyberMiles 连最基础的智能合约代码也没有轻易放过,值得我们学习。

 

Bet game 竞猜小游戏

这次workshop 还有进阶版,通过智能合约发起一个竞猜游戏,由智能合约当裁判,可以说具备了完全的公正性。
代码比较复杂,不再一一解释,有兴趣的朋友可以自行去 github 研究一下。

https://github.com/CyberMiles/education/blob/master/meetups/beijing/2-smart-contract-101/bet_game.lity

Owner 把智能合约部署在CyberMiles 区块链上后,玩家可以在Remix for CMT中输入合约地址,调用该合约,参与竞猜游戏。

游戏规则是每个参加workshop的人先从2到12中随机选择一个整数,并为自己选择的数字支付一定数量的CMT作为赌注。如果猜对了,将获得等比例的CMT。


规则公布后,Owner 选择startGame ,游戏正式开始!大家在现场跃跃欲试,有人大声说着”all in”,有人应和着,现场一时异常欢乐。这也是5个CMT的神秘用处!

调用合约成功后,在右下方 placeBet处填写自己选择的整数,在右上方Value处,将单位选择为CMT,并且填写自己准备花费多少钱。填好后,通过Metamask for CMT支付 gas费,将下来坐等开奖!


杨乐在微信中随机掷了两个骰子,确认了最终的正确答案。在骰子”尘埃落定”的过程中,一片安静,静悄悄地等最终答案,看来大家都沉浸在游戏中了。

正确答案出来后,合约Owner 在endGame处填写数字8,并支付gas费。

接下来就到领奖环节,根据智能合约的规则,前面在 placeBet 填写了数字8的参与者将按比例平分收集到的所有下注的CMT。
赢家点击payme,支付gas 费,合约将自动把分配好的CMT 转账到赢家的CMT 账户里,这一切由代码计算,执行。

现场有两位赢家,一位以0.5 CMT拿走了5.3个CMT,一位以2CMT拿走21.2CMT。当然也有没有猜中的的同学不死心地点了payme,但是因为不是赢家,什么也没拿到,白白地支付了gas费。不相信智能合约是不行的。

结果公示,两位赢家拿走奖励后,Owner 选择 terminate 这个合约,游戏到此圆满结束!

用5个CMT 编写智能合约,和周围的小伙伴一起讨论这段代码该怎么理解,又有CMT开发社区的人热心指导,最后参与到有趣的游戏中,见证了什么叫做”Code is law”。

这是一次非常棒的体验,也是区块链技术应有的魅力之处!

 

<think>首先,用户的问题是关于如何通过计算机远程控制一个使用CMT2105L芯片的开发板,该板有四个按钮和一个LED灯。CMT2105L芯片是一个射频收发芯片,通常用于无线通信。 关键点: - 芯片:CMT2105L(射频收发芯片) - 开发板:包括四个按钮和一个LED灯 - 目标:通过计算机远程控制这个开发板 我需要回想一下CMT2105L是什么。CMT2105L是Silicon Labs的EZRadio系列芯片,用于低功耗无线通信。它支持Sub-GHz频段,常用于IoT设备。 用户提到开发板有四个按钮和一个LED灯,所以它可能是一个简单的评估板或开发套件的一部分。 为了远程控制,我需要考虑如何建立计算机和开发板之间的通信。既然CMT2105L是无线芯片,通信应该通过无线方式实现。 可能的方案: 1. **计算机到开发板的通信路径**: - 计算机需要一种方式发送命令到开发板。 - 开发板上的CMT2105L可以接收无线信号。 - 因此,计算机需要一个能与CMT2105L通信的无线模块。 2. **硬件需求**: - **开发板端**:已经有一个CMT2105L芯片,所以它可以接收无线信号。开发板可能有一个微控制器(如STM32)连接到CMT2105L,处理接收到的命令并控制按钮/LED。 - **计算机端**:需要一个无线模块,比如另一个CMT2105L模块或兼容的收发器,连接到计算机(例如通过USB)。 3. **软件方面**: - 在开发板上,需要固件来监听无线信号,解析命令(例如,控制LED或模拟按钮按下)。 - 在计算机上,需要软件(如Python脚本或C++程序)来发送命令。这可以使用串口或其他接口与计算机端的无线模块通信。 4. **具体步骤**: - **步骤1:设置开发板固件**:开发板应该运行一个程序,使用CMT2105L接收数据。当接收到特定命令时,它控制LED或模拟按钮动作(例如,通过GPIO)。 - 例如,如果命令是"LED_ON",则点亮LED;如果是"BUTTON1_PRESS",则触发按钮1的动作。 - **步骤2:设置计算机端**:计算机需要连接一个无线模块(如USB Dongle with CMT2105L)。然后,编写软件发送数据包。 - 软件可以使用Python的pyserial或类似库通过串口发送命令到无线模块。 - **步骤3:通信协议**:定义一个简单的协议,比如基于ASCII或二进制格式的命令。 5. **引用系统级指令**:用户提到了引用[1]和[2],但它们是关于STM32的,不是直接相关。引用[1]提到STM32F103RCT6,有串口等;引用[2]提到STM32F407。这些可能暗示开发板有微控制器,但用户的问题是关于CMT2105L芯片的开发板。 用户说:"该板包括四个按钮和一个LED灯",但没有指定微控制器。CMT2105L本身只是一个收发器,通常需要与微控制器配对使用。所以,开发板很可能有一个MCU(如STM32)控制CMT2105L。 从引用[1],它提到STM32F103RCT6,有串口等,所以或许开发板是基于STM32的。 在回答中,我需要: - 使用中文。 - 遵循LaTeX格式:行内数学用$...$,独立公式用$$...$$。 - 结构清晰,逐步解决问题。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 由于用户提供了引用,我应该参考它们,但它们不是直接关于CMT2105L的。引用[1]是关于STM32开发板的,引用[2]是关于STM32F407的智能家居系统。所以,我可以间接引用它们,如果相关。 构建回答: 1. **引言**:解释基本概念。 2. **硬件设置**:描述如何连接计算机和开发板。 3. **软件实现**:开发板固件和计算机软件。 4. **示例代码**:提供简单的代码示例(如Python和C)。 5. **生成相关问题**:在最后。 确保真实可靠:基于一般知识,CMT2105L的典型用法。 详细步骤: - **开发板端**: - 使用微控制器(如STM32)编程,初始化CMT2105L为接收模式。 - 定义命令:例如,字节序列表示动作。 - 当接收到数据时,解析并控制GPIO(LED或按钮模拟)。 - **计算机端**: - 使用另一个无线模块(如CMT2105L USB Dongle)。 - 编写脚本发送数据:例如,Python使用pyserial发送字符串。 通信协议简单:比如,发送"LED_ON"或"BUTTON1"。 代码示例: - 开发板固件:伪代码或C代码。 - 计算机软件:Python脚本。 最后,生成相关问题。</think>### 通过计算机远程控制使用CMT2105L芯片的开发板 要实现对搭载CMT2105L芯片的开发板进行远程控制(该开发板包括四个按钮和一个LED灯),核心在于建立计算机与开发板之间的无线通信链路。CMT2105L是一款低功耗Sub-GHz射频收发芯片,常用于IoT设备,支持数据传输速率高达100 kbps,工作频段可配置(如315 MHz、433 MHz等)。开发板通常包含一个微控制器(如STM32系列)来管理CMT2105L的通信和GPIO控制(按钮和LED)。以下方案基于标准硬件和软件实现,确保可靠性和可扩展性。方案分为硬件连接、软件实现和通信协议三部分。 #### 1. **硬件设置** - **开发板端**:开发板需要集成CMT2105L芯片和微控制器(如STM32F103RCT6或类似,参考引用[1])。CMT2105L负责无线收发,微控制器处理命令并控制GPIO(按钮作为输入、LED作为输出)。开发板天线需正确配置以确保通信距离(典型室内范围10-50米)。 - 连接方式:CMT2105L通过SPI或UART接口连接到微控制器;按钮和LED连接到微控制器的GPIO引脚。 - **计算机端**:需要一个无线通信模块(如CMT2105L USB Dongle),连接到计算机的USB端口。此模块作为“网关”,将计算机命令无线发送到开发板。推荐使用现成的评估模块,如Silicon Labs的SLWSTK6100A套件。 - 整体架构:计算机 → USB Dongle(CMT2105L) → 无线信号 → 开发板(CMT2105L + MCU) → 控制按钮/LED。 - **关键参数**:确保双方CMT2105L配置相同频段(如433 MHz)、数据速率和调制方式(如FSK),以避免通信失败。开发板的微控制器需具备足够GPIO资源,这与引用[1]中STM32F103RCT6的51个GPIO口兼容[^1]。 #### 2. **软件实现** 软件分为开发板固件和计算机控制程序。使用C语言开发固件(基于STM32 HAL库),计算机端用Python脚本(简单易用)。通信协议基于简单的ASCII命令格式,确保低延迟。 - **开发板固件(STM32程序)**: - 初始化:配置CMT2105L为接收模式,设置GPIO(按钮为输入、LED为输出)。 - 主循环:监听无线数据,解析命令并执行动作。 - 示例代码(伪代码,使用STM32CubeIDE开发): ```c #include "stm32f1xx_hal.h" #include "cmt2105l.h" // CMT2105L驱动库 void main() { // 初始化硬件 HAL_Init(); CMT2105L_Init(); // 配置无线模块 GPIO_Init(); // 设置按钮和LED的GPIO while (1) { uint8_t rx_data[32]; if (CMT2105L_Receive(rx_data)) { // 接收数据 if (strcmp(rx_data, "LED_ON") == 0) { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); // 点亮LED } else if (strcmp(rx_data, "BUTTON1_PRESS") == 0) { // 模拟按钮1按下(通过触发GPIO中断或直接控制) simulate_button_press(BUTTON1_Pin); } // 类似处理其他命令:LED_OFF, BUTTON2_PRESS等 } HAL_Delay(100); // 延时避免CPU过载 } } ``` - 命令解析:定义简单ASCII命令,如`LED_ON`、`BUTTON1_PRESS`。开发板收到命令后,通过GPIO控制LED状态或模拟按钮动作(例如,设置GPIO电平模拟按钮按下)。 - **计算机控制程序(Python脚本)**: - 使用PySerial库通过USB串口发送命令到CMT2105L USB Dongle。 - 安装依赖:`pip install pyserial` - 示例代码: ```python import serial import time # 配置串口(根据实际COM端口修改) ser = serial.Serial('COM3', baudrate=9600, timeout=1) # USB Dongle的串口号 def send_command(command): ser.write(command.encode('ascii')) # 发送ASCII命令 print(f"Sent: {command}") time.sleep(0.1) # 确保数据传输稳定 # 示例:远程控制LED和按钮 send_command("LED_ON") # 点亮LED send_command("BUTTON1_PRESS") # 模拟按下按钮1 # 关闭连接 ser.close() ``` - 操作方式:运行脚本后,输入命令即可远程控制开发板。命令可扩展为控制所有四个按钮和LED。 - **通信协议**: - 格式:ASCII字符串,以`\n`结尾(确保可靠解析)。 - 命令集: - `LED_ON`:点亮LED。 - `LED_OFF`:熄灭LED。 - `BUTTON<X>_PRESS`:模拟按钮按下(X=1,2,3,4)。 - 可靠性:添加CRC校验或重传机制(如果环境干扰大),数据包长度不超过32字节以匹配CMT2105L缓冲区。 #### 3. **测试与优化** - **测试步骤**: 1. 烧录固件到开发板(使用ST-Link或JTAG)。 2. 连接CMT2105L USB Dongle到计算机,识别COM端口。 3. 运行Python脚本发送命令,观察开发板响应。 4. 测量通信距离和延迟,调整频段或功率(通过CMT2105L寄存器配置)。 - **优化建议**: - **安全性**:添加简单加密(如XOR加密命令),防止未授权访问。 - **扩展性**:支持更多传感器(如引用[2]中的智能家居系统),通过短信或手机App集成[^2]。 - **性能**:如果延迟高,优化微控制器中断处理或使用DMA传输(参考引用[1]的DMA控制器)[^1]。 此方案成本低(USB Dongle约$10),适用于家庭自动化或原型开发。确保开发板供电稳定(电池或USB),并遵守当地无线法规。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值