智能合约不可更改的优势让它很自然地适用于合约条款的场景,它可以有效地减少恶意篡改,减少人工干预。比如可以在以太坊上写一个类似银行的智能合约,然后人们就可以通过这个合约来存钱、取钱。这样就不会出现因为银行工作人员因失误或恶意更改导致余额不对等情况的出现。
事实上,这个“银行”智能合约里存的钱不一定是大饼(ETH),因为以太坊智能合约它还允许合约开发人员定义自己的货币,就是我们所知道的各种基于以太坊的Token,比如USDT,NBN等。
ERC全称是“Ethereum Request for Comment”,MMMBSC互助智能合约系统13z开4z77发z558,表示以太坊版的意见征求稿,ERC中包含技术和组织等注意事项及标准。这套标准其实不光由以太坊官方提出,还由一些以太坊爱好者提出。
以前面谈到的银行智能合约为例,我们不难想到它会具备以下几个功能和须知:
1.需要有记录每一个客户的余额;
2.需要具备转钱的功能,即包含存钱与取钱;
3.要保证每个客户能够查询自己的余额。
以上这些功能和须知仔细一思考,好像是每个“银行”合约都需要具备的,也是Token合约所需要具备的,因此为了更好地兼容钱包,兼容交易所,以太坊发行了像ERC20,ERC721这样的代币协议标准。
比如阿猫币、阿狗币都是基于ERC20标准发行的,那么它们都会提供给用户一些选择按钮(即接口函数一致),这些选择按钮供用户查询余额,转移代币等,但是阿猫币、阿狗币底层实现查询余额和转移代币的等功能的方式可以不同。
除了Token合约需要规范一样,其他的一些包括但不限于数据包的设计、一些接口的定义规则等也有一些ERC标准。这些标准协议一些来自于以太坊创团队,一些来自于以太坊的爱好者、贡献者的提议。总的来说,都是为了共同创建一个更好的以太坊环境。 //Vanilla JS
//PLAY IN FULL PAGE VIEW!
window.addEventListener("DOMContentLoaded", game);
//General sprite load var sprite = new Image(); var spriteExplosion = new Image(); sprite.src = 'img/sprite.png';
window.onload = function() { spriteExplosion.src = 'img/explosion.png'; };
//Game function game() {
//Canvas
var canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
cH = ctx.canvas.height = window.innerHeight,
cW = ctx.canvas.width = window.innerWidth ;
//Game
var bullets = [],
asteroids = [],
explosions = [],
destroyed = 0,
record = 0,
count = 0,
playing = false,
gameOver = false,
_planet = {deg: 0};
//Player
var player = {
posX : -35,
posY : -(100+82),
width : 70,
height : 79,
deg : 0
};
canvas.addEventListener('click', action);
canvas.addEventListener('mousemove', action);
window.addEventListener("resize", update);
function update() {
cH = ctx.canvas.height = window.innerHeight;
cW = ctx.canvas.width = window.innerWidth ;
}
function move(e) {
player.deg = Math.atan2(e.offsetX - (cW/2), -(e.offsetY - (cH/2)));
}
function action(e) {
e.preventDefault();
if(playing) {
var bullet = {
x: -8,
y: -179,
sizeX : 2,
sizeY : 10,
realX : e.offsetX,
realY : e.offsetY,
dirX : e.offsetX,
dirY : e.offsetY,
deg : Math.atan2(e.offsetX - (cW/2), -(e.offsetY - (cH/2))),
destroyed: false
};
bullets.push(bullet);
} else {
var dist;
if(gameOver) {
dist = Math.sqrt(((e.offsetX - cW/2) * (e.offsetX - cW/2)) + ((e.offsetY - (cH/2 + 45 + 22)) * (e.offsetY - (cH/2+ 45 + 22))));
if (dist < 27) {
if(e.type == 'click') {
gameOver = false;
count = 0;
bullets = [];
asteroids = [];
explosions = [];
destroyed = 0;
player.deg = 0;
canvas.removeEventListener('contextmenu', action);
canvas.removeEventListener('mousemove', move);
canvas.style.cursor = "default";
} else {
canvas.style.cursor = "pointer";
}
} else {
canvas.style.cursor = "default";
}
} else {
dist = Math.sqrt(((e.offsetX - cW/2) * (e.offsetX - cW/2)) + ((e.offsetY - cH/2) * (e.offsetY - cH/2)));
if (dist < 27) {
if(e.type == 'click') {
playing = true;
canvas.removeEventListener("mousemove", action);
canvas.addEventListener('contextmenu', action);
canvas.addEventListener('mousemove', move);
canvas.setAttribute("class", "playing");
canvas.style.cursor = "default";
} else {
canvas.style.cursor = "pointer";
}
} else {
canvas.style.cursor = "default";
}
}
}
}