闪电网络系列——RSMC

今天深入分析闪电网络的第1个部分:RSMC。

RSMC
RSMC,全称Revocable Sequence Maturity Contract。 Revocable,就是可撤销的意思; Sequence就是指第12课 nLockTime(CLTV)与Sequence number(CSV) 讲述的Sequence Number。 Sequence Maturity,通俗点讲,就是等到Sequence Number满足条件了,进行履约。

所以翻译成中文就是:可撤销的、基于Sequence成熟度的合约。


RSMC解决的问题
(1)双向支付,而不是单通道
(2)1方中途退出,另外1方要立即拿回钱,而不是等到nLockTime到期才能拿回钱。 同时,应该对主动退出方实行惩罚。
(3)保证交易双方,任何1方都不能抵赖、反悔。


RSMC交易过程详解
下面就看一下,RSMC如何达成上面的目标。
考虑如下场景,假设Alice与Bob之间经常有资金往来,看他们如何通过RSMC技术实现互相转账:

Step1: 同微支付通道1样,生成1个保证金交易(Funding Transaction)。不过和微支付通道的区别是,这里是双向支付。所以双方,各拿1笔钱出来,打入这个公共账户。


Step2:  同微支付通道类似,为这笔钱生成退款交易(Refund Transaction)。双方可以各自拿回自己的0.5比特币。

备注:和微支付通道一样,实际过程是,双方完成了Step2之后,才会把Step1的交易广播出去。以防钱被死锁在公共账号里面!!!

重点来了:Alice生成的退款交易是C1a + RD1a,Bob生成的退款交易是C1b+RD1b,2者是对称的。 
假入Alice要拿回钱,它就广播C1a + RD1a;
假入Bob要拿回钱,它就广播C1b + RD1b。

 

为什么这么处理呢?
我们看一下:假设Alice想主动中断交易,也就是它把C1a + RD1a 广播到了区块链网络上,那结果是什么呢??

我们会看到C1a里面,会把Bob的0.5比特币立即返还给Bob,而Alice的0.5比特币被打到了1个新的公共账号: Alice2 & Bob里面!!!

Alice要拿回自己的0.5比特币,要等到RD1a被兑现。而RD1a有个seq = 1000属性,也就是要等到C1a所在的块,后面被追加了1000个块之后,RD1a这个交易才会被进入区块链里面,Alice才能拿到自己的钱!!

一句话:如果Alice主动中断交易(把C1a + RD1a广播到了区块链上),Bob立马拿回自己的钱,Alice则要等到Sequence Maturity之后,才能拿回钱(Alice被轻微惩罚了)。反之亦然!!


Step3: Alice与Bob开始交易
假设Alice要付给Bob 0.1 比特币,那么公共账号里面的资金分配,就从0.5/0.5,变成了0.4/0.6。

过程如下:
Alice生成了C2a与RD2a,C1a与RD1a废除;
同样,Bob生成了C2b与RD2b,  C1b和RD1b废除。


重点:
在双方达成了C2a/RD2a, C2b/RD2b之后,如何让C1a, RD1a, C1b, RD1b 废除呢? 换句话说,如何保证Alice不反悔(不让Alice把C1a与Rd1a广播到区块链上去?)同样,如何保证Bob不反悔(不让Bob把C1b与Rd1b广播到区块链上去?)

这需要引入惩罚机制!!
在Alice生成C2a/RD2a之前,他要把自己在C1a里面的私钥 Alice2发给Bob;同样,Bob把自己的C1b里面的私钥Bob2发给Alice。

这样,各自会生成一个惩罚交易:

如下图所示:Alice把秘钥Alice2给了Bob,Bob会为C1a生成1个惩罚交易BR1a,攥在自己手里,以防Alice反悔。

假设Alice反悔,也就是把C1a + RD1a广播出去了,Bob就把BR1a广播出去!! BR1a由于没有Sequence,肯定会先于RD1a执行,所以结果是RD1a不会被执行,BR1a执行了。造成的结果是,Alice拿不回钱,Bob会把Alice的0.5 比特币全转账到自己账户里面,这就是对Alice的惩罚。

反之亦然,会为C1b生成BR1b。

一句话:BR1a是Bob攒在手里的Alice的把柄,BR1b是Alice攥在手里的Bob的把柄,任何1方都不敢把旧的交易广播出去。也就是一旦达成了C2a/RD2a + C2b/RD2b,1就废除了。

Step4: 同微支付通道一样,双方最终完成了交易,把Step3里面,最后1次更新,广播到网络上,各自得到自己的钱。最后1次的,sequence = 0,双方都立即拿到自己的钱。


总结
通过上面的过程分析,我们可以看出,RSMC设计的很巧妙:
(1)通过双方各自往同1个公共账号打钱,实现了双向支付。
(2)Alice拿回钱的时候,没有直接打回到她自己的账号里面。而是打到1个新的公共账号 Alice2 & Bob,然后再用一个有sequence number的 RD1a最终拿回钱。通过这点,实现了谁主动中断,谁延迟退钱。这点做的很巧妙!!!
(3)双方协商新1轮的时候,都把自己上1轮的私钥给对方,相当于把自己的把柄给了对方,这样双方都不敢反悔。
这里,又1个很巧的地方:
虽然Alice把私钥给了对方,但Alice不广播C1a,那对方的处罚交易BR1a也不会执行。
Alice广播了C1a,对方就基于广播的交易执行处罚交易BR1a;
Alice不广播C1a,对方也就没机会执行处罚交易BR1a。 
反之亦然!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于反步滑模算法的AUV(自主水下机器人)的MATLAB代码是一种在水下机器人控制常用的算法。反步滑模控制算法能够有效地控制机器人在水下的运动轨迹,保证机器人的稳定性和鲁棒性。 以下是一个简单的基于反步滑模算法的AUV MATLAB代码示例: ```matlab function AUV_control() % 初始化参数 k1 = 1; k2 = 1; k3 = 1; lambda = diag([0.1, 0.1, 0.1]); % 设定目标位置 xd = [0; 0; 0]; % 设定初始位置 x0 = [1; 1; 1]; % 控制循环 for t = 0:0.1:10 % 计算误差 e = x0 - xd; % 计算初始反步滑模控制器 u1 = -k1 * e(1) - k2 * e(2) - k3 * e(3); % 计算滑模面的导数 s_dot = lambda * e; % 计算控制器的输出 u2 = -s_dot(1); u3 = -s_dot(2); u4 = -s_dot(3); % 更新AUV的状态 x_dot = AUV_dynamics(x0, u1, u2, u3, u4); x0 = x0 + x_dot * 0.1; % 假设时间步长为0.1 % 显示AUV的位置 disp(x0); % 终止条件 if norm(e) < 0.001 break; end end end function x_dot = AUV_dynamics(x, u1, u2, u3, u4) % AUV的动力学方程 % 这里的方程可以根据具体的AUV模型进行自定义 % ODE solver or a fixed-step method can be used x_dot = [u2; u3; u4]; end ``` 该代码,`AUV_control`函数是主函数,它通过循环调用`AUV_dynamics`函数来计算机器人的状态更新。在每个循环,该算法计算误差、滑模面的导数以及控制器的输出,并更新水下机器人的状态。最终,当误差足够小时,循环终止。 注意,此处的`AUV_dynamics`函数是根据实际AUV模型进行定义的,需根据具体的AUV模型进行修改。 该代码只是一个简单的示例,实际应用可能需要更复杂和精细的设计和调试。 ### 回答2: 基于反步滑模算法的AUV(Autonomous Underwater Vehicle)(自主水下机器人)的MATLAB代码如下: ``` % 定义AUV的动力学方程参数 m = 1000; % 质量 B = 200; % 阻力系数 rho = 1000; % 密度 g = 9.81; % 重力加速度 % 定义期望位置和速度 xd_des = 10; % 期望位置 xd_dot_des = 0; % 期望速度 % 定义控制增益 k1 = 1; % 位置增益 k2 = 1; % 速度增益 % 定义滑模控制参数 lambda = 1; % 滑模超平面参数 k = 1; % 滑模控制增益 % 初始化 x = 0; % 位置 x_dot = 0; % 速度 % 模拟时间 tf = 10; dt = 0.01; t = 0:dt:tf; % 开始模拟 for i = 1:length(t) % 计算滑模面 s = x - xd_des + lambda * (x_dot - xd_dot_des); % 计算控制力 u = -k * sign(s); % 计算动力学方程 x_dot_dot = (u - B * x_dot^2) / m - g; % 更新位置和速度 x_dot = x_dot + x_dot_dot * dt; x = x + x_dot * dt; end % 绘制位置和速度曲线 figure; subplot(2, 1, 1); plot(t, x); xlabel('时间'); ylabel('位置'); title('AUV位置'); subplot(2, 1, 2); plot(t, x_dot); xlabel('时间'); ylabel('速度'); title('AUV速度'); ``` 该代码实现了基于反步滑模控制的AUV运动控制,其定义了AUV的动力学方程参数,期望位置和速度,控制增益,滑模控制参数等。在模拟,通过计算滑模面,并基于滑模面反馈对AUV施加控制力,然后根据动力学方程更新AUV的位置和速度。最后,通过绘制位置和速度的曲线,可以观察AUV的运动轨迹和速度变化。 ### 回答3: 基于反步滑模算法的AUV(自主水下无人车)的MATLAB代码如下: ```matlab % 创建反步滑模控制器 rsmc = robotics.feedbackSmc; % 设置水下无人车控制系统参数 % 设定期望位置 rsmc.ReferenceSignal = [1; 2; 3]; % 设置系统状态权重 rsmc.StateWeight = diag([1 1 1]); % 设置输入权重 rsmc.InputWeight = diag([1 1 1]); % 设置滑模面参数 rsmc.SlidingSurfaceGain = 1; rsmc.SlidingSurfaceDerivGain = 1; % 设置鲁棒性参数 rsmc.RobustnessGain = 0.1; % 设置AUV模型 auv = robotics.AUV; % 设定AUV初始位置 auv.Position = [0; 0; 0]; % 设定AUV初始速度 auv.Velocity = [0; 0; 0]; % 设定水下无人车质量 auv.Mass = 10; % 设置控制器采样时间 rsmc.SampleTime = 0.1; % 设置仿真时间 t = 0:0.1:10; % 初始化存储系统状态和控制信号 position = zeros(3, length(t)); velocity = zeros(3, length(t)); force = zeros(3, length(t)); % 循环仿真 for i = 1:length(t) % 更新控制器状态 rsmc.State = auv.Position; % 计算下一时刻的控制信号 u = rsmc.step(); % 更新系统状态 acceleration = u / auv.Mass; position(:, i+1) = auv.Position + auv.Velocity * rsmc.SampleTime; velocity(:, i+1) = auv.Velocity + acceleration * rsmc.SampleTime; % 更新AUV控制力 force(:, i+1) = u; % 将AUV位置和速度信息传递给控制器 auv.Position = position(:, i+1); auv.Velocity = velocity(:, i+1); end % 绘制AUV位置和速度随时间变化的曲线 figure; subplot(2, 1, 1); plot(t, position); xlabel('时间'); ylabel('位置'); legend('X', 'Y', 'Z'); subplot(2, 1, 2); plot(t, velocity); xlabel('时间'); ylabel('速度'); legend('V_x', 'V_y', 'V_z'); ``` 以上就是基于反步滑模算法的AUV MATLAB代码的一个示例。其,首先创建了反步滑模控制器对象,并设置控制器的参数。然后创建了AUV(自主水下无人车)模型对象,并设置AUV的初始状态和参数。在主循环,根据控制器反馈调整控制信号,更新AUV系统状态,并将位置和速度信息传递给控制器进行下一步控制计算。最后使用MATLAB的绘图函数绘制AUV位置和速度随时间变化的曲线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值