区块链电⼒交易市场⽅案及源码
区块链最擅长处理去中⼼化市场这⼀类问题,随着能源市场中可再⽣能源的发展,显然区块链有可能颠覆⽬前能源产业的中⼼化格局。在这⽚⽂章中,我们将介绍基于以太坊区块链的区中⼼化电⼒市场解决⽅案并提供智能合约的实现代码。
1、电⼒⽹络的运⾏机制
以太坊教程链接:
| | | | | | |
简单来讲,电⼒⽹络负责匹配电⼒的⽣产与消费。如果我的笔记本电脑在两⼩时内需要200⽡的电⼒,那么就需要有⼈在同⼀时间段向同⼀电⼒⽹络中提供200⽡的电⼒。如果1万⼈同时使⽤笔记本电脑,那就意味着在同⼀时刻需要向电⼒⽹络中提供200万⽡的电⼒。在电⼒的⽣产和消费之间由于传输距离
的影响,存在着⼀定的电⼒损耗,⽽且绝⼤多数电⼒⽹络会有⼏套电路来路由电⼒供应,不过基本上其⼯作原理就是上⾯所述。
在这⼀场景中通常有4种参与的⾓⾊:
电⼒⽣产商:负责发电并以此获利
电⼒分销商:负责维护电⼒⽹络,以便将电⼒从发电企业输送到消费者
电⼒零售商:从发电企业批量购买电⼒并出售给消费者
电⼒消费者:从零售商购买电⼒
这⼀买卖电⼒的⾏为并不是说电⼒零售商可以从某个风⼒发电企业购买电⼒并将其出售给特定的消费者,零售商买⼊和卖出的其实是⼀种认证。
每个发电企业要将其电⼒进⼊⽹络都需要先有认证。消费者要从⽹络中获得电⼒也需要有⾜够的认证。显然不允许使⽤同样的认证进⾏电⼒的买⼊或卖出。这⼀模式已经运⾏了近100年。
中⼼化的发电意味着⼤型电站为⼤量消费者供应电⼒。传统的电⼒流向是通过电⼒分配⽹络从发电企业到消费者,⽽资⾦流向是从消费者通过零售商到电⼒⽣产企业,这⼯⼚也会借助于电表来匹配消费者的⽤电量。
最近这⼀场景已经开始向⽣产性消费变化。现在在⼀些国家有⼤量家庭使⽤太阳能板发电,这些⽣产性消费者有时从⽹络中获取电⼒,有时⼜可以将⾃⼰⽤不完的电⼒输⼊⽹络。
这使得电⼒市场更加复杂。这些⽣产性消费者如何认证?谁来决定其供电价格?谁来买这些电?电⼒分销商现在不仅对⽹络的平衡问题头疼,⽽且这还是⼀个复杂的去中⼼化市场。
可能你已经⼤概明⽩应该⼲点什么了,我相信⼀定有办法利⽤区块链技术为这些⽣产性消费者打造⼀个有效的去中⼼化市场。
2、区块链去中⼼化电⼒市场业务⽤例
我们的业务⽤例是⼀个可再⽣能源交易⽅⾯的⽣产性消费者场景。我们假设电⼒分销商运⾏着电⼒能源市场并使⽤货币化激励机制来平衡电⼒的⽣产与消费。
这类似于真实世界中的能源市场,但并不完全⼀致。我尽可能保持⽤例的通⽤,因为基于区块链的能源市场还存在⼀些计算⽅⾯的约束。
在现实的电⼒能源市场中,电⼒⽣产商在⼀定时间区间内会下注⼀个其愿意发电的价格,零售商通常会以最低价格从⽣产商处买电。这其实和股票交易市场的运作模式⼀样,但是对于当前的区块链平台⽽⾔计算量太⼤了。
3、基于以太坊的电⼒市场DApp设计
我们将使⽤以太坊区块链的ERC20通证作为货币来实现这个简化的能源市场,使⽤两个变量来表⽰市场中的⽣产与消费负载。我们将时间拆分为不同单位,⽬的是在每个时间单位⾥尽可能实现电⼒⽣产和消费负载的平衡。
我将从去中⼼化⾦融中的uniswap市场到了⼀些灵感,并使⽤⼀个简单的价格公式:当指定时间区间内电⼒⽣产商多于消费者时,就降低电⼒价格。这样,便宜的电⼒就可以激励消费者多⽤电,⽽⽣产商就会尽可能少发电,从⽽实现⽹络的平衡。反⽽⾔之,当⽹络中的电⼒⽣产商少于消费者时电⼒价格就上涨。
简⽽⾔之,电⼒⽹络负责匹配电⼒供求关系,供不应求时,电价上涨,供过于求时,电价下降。
在所有的交易中,电⼒分配⽹络都是⼀个参与者。电⼒分配⽹络将设定电价。供电企业向分配⽹络出售电⼒,消费者从分配⽹络购买电⼒。物理的电⼒分配⽹络保持不变,但是在⽣产性消费者之间的⾦融分配⽹络现在变成了区块链上去中⼼化的智能合约。
我移除了很多复杂的特性以便聚焦于市场机制。我相信有可能基于区块链实现⼀个全国性的能源市场,但是为了完成本⽂,我们必须简化场景。我将在本⽂的结束部分探讨这些被忽略的特性。
现在让我们看看这个基于以太坊区块链的去中⼼化电⼒市场的智能合约的实现代码,合约使⽤Solidity实现,相关教程可以参考:。
4、电⼒市场Solidity智能合约实现
Uniswap⽅式的去中⼼化市场,最⼤的优点就是⾮常简单。在我们的⽤例中,整个
电⼒能源交易市场只需要不到100⾏Solidity代码就可以实现,这还包含了注释:
pragma solidity ^0.5.10;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@hq20/contracts/contracts/access/Whitelist.sol";/**
* @title Energy Market
* @notice Implements a simple energy market, using ERC20 and
* Whitelist. ERC20 is used to enable payments from the consumers to
* the distribution network, represented by this contract, and from
* the distribution network to the producers. Whitelist is used to
* keep a list of compliant smart meters that communicate the
* production and consumption of energy.
*/
contract EnergyMarket is ERC20, Whitelist {
event EnergyProduced(address producer, uint256 time);
// uint128 is used here to facilitate the price formula
event EnergyConsumed(address consumer, uint256 time);
// Casting between uint128 and int256 never overflows
// int256(uint128) - int256(uint128) never overflows
mapping(uint256 => uint128) public consumption;
mapping(uint256 => uint128) public production;
uint128 public basePrice;  /**
* @dev The constructor initializes the underlying currency token    * and the smart meter whitelist. The constructor also mints the    * requested amount of the underlying currency token to fund the    * network load. Also sets the base energy price, used for
* calculating prices.
*/
constructor (uint256 _initialSupply, uint128 _basePrice)
public
ERC20()
Whitelist()
{
_mint(address(this), _initialSupply);
basePrice = _basePrice;
}  /**
* @dev The production price for each time slot.
*/
function getProductionPrice(uint256 _time)
public
view
returns(uint256)
{
return uint256(
max(
0,
int256(basePrice) *
(3 + safeSub(production[_time], consumption[_time]))
)h5源码交易平台
);
}  /**
* @dev The consumption price for each time slot
*/
function getConsumptionPrice(uint256 _time)
public
view
returns(uint256)
{
return uint256(
max(
0,
int256(basePrice) *
(3 + safeSub(consumption[_time], production[_time]))
)
);
}  /**
* @dev Add one energy unit to the distribution network at the
* specified time and be paid the production price. Only
* whitelisted smart meters can call this function.
*/
function produce(uint256 _time)
public
{
require(isMember(msg.sender), "Unknown meter.");
msg.sender,
getProductionPrice(_time)
);
production[_time] = production[_time] + 1;
emit EnergyProduced(msg.sender, _time);
}  /**
* @dev Take one energy unit from the distribution network at the    * specified time by paying the consumption price. Only
* whitelisted smart meters can call this function.
*/
function consume(uint256 _time)
public
{
require(isMember(msg.sender), "Unknown meter.");
msg.sender,
address(this),
getConsumptionPrice(_time)
);
consumption[_time] = consumption[_time] + 1;
emit EnergyConsumed(msg.sender, _time);
}  /**
* @dev Returns the largest of two numbers.
*/
function max(int256 a, int256 b)
internal
pure
returns(int256)
{
return a >= b ? a : b;
}  /**
* @dev Substracts b from a using types safely casting from
* uint128 to int256.
*/
function safeSub(uint128 a, uint128 b)
internal
pure
returns(int256)
{
return int256(a) - int256(b);
}
}
我们的实现将继承以太坊区块链的ERC20和Whitelist合约。ERC20为我们提供了⽀付⼯具,⽩名单则允许我们只允许得到认证的消费者和供电企业进⼊市场。
uniswap市场需要⽤⼀些资⾦来初始化,这是因为电⼒⽣产者可能多于消费者,⽽市场需要从消费者收钱,并付款给⽣产者。因此需要⼀点价差资⾦。
价格是基于⽣产和消费复杂的差异,使⽤两个简单的公式计算得到的。当电⼒⽣产和消费负载⼀致时就得到基准价格。请忽略合约代码中的所有类型转换,那只是为了进⾏计算⽅⾯的溢出保护。
这个机制⾮常简单,因此可以应⽤在算⼒有限的区块链上,⽽同时它也⿎励电⼒⽣产和消费的平衡,在任何⼀个⽅向上的不稳定都会造成资⾦的损失。
重要的⼀点,是要注意现在是区块链智能合约在控制着资⾦的流向,⽣产和消费委托单通常填写未来的时间。物理配电⽹络会对所建议的消费和⽣产负载有所了解并能在需要平衡电⼒⽹络时采取措施。
只有在⽩名单中的电⼒⽣产者可以为电⼒⽹络供电,他们只需要声明其发电⽬的即可⽴即收到款。显然这是现实场景的⼀个超级简化,在真实的⽣产环境中资⾦应当被托管并直⾄⽣产者真正供电才向其释放资⾦。
能源的消费机制也是⼀样的。消费者声明其⽤电⽬的并以电⼒⽹络确定的价格⽀付。在现实⽣活中,有可能会根据消费者的实际⽤电量有⼀些资⾦返还。
原⽂链接:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。