Submitted by admin on 2018, January 9, 10:21 PM
下是一个接口合同,声明所需的功能和事件以符合ERC20标准:
// https://github.com/ethereum/EIPs/issues/20
contract ERC20 {
function totalSupply() constant returns (uint totalSupply);
function balanceOf(address _owner) constant returns (uint balance);
function transfer(address _to, uint _value) returns (bool success);
function transferFrom(address _from, address _to, uint _value) returns (bool success);
function approve(address _spender, uint _value) returns (bool success);
function allowance(address _owner, address _spender) constant returns (uint remaining);
event Transfer(address indexed _from, address indexed _to, uint _value);
event Approval(address indexed _owner, address indexed _spender, uint _value);
}
大部分Ethereum主要标记符合ERC20标准。
一些令牌包括描述令牌合同的进一步信息:
string public constant name = "Token Name";
string public constant symbol = "SYM";
uint8 public constant decimals = 18; // 大部分都是18
如何工作?
以下是令牌合约的一个片段,用于演示令牌合约如何维护Ethereum帐户的令牌余额
contract TokenContractFragment {
// Balances 保存地址的余额
mapping(address => uint256) balances;
// 帐户的所有者批准将金额转入另一个帐户
mapping(address => mapping (address => uint256)) allowed;
// 特定帐户的余额是多少?
function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner]; //从数组中取值
}
// 将余额从所有者帐户转移到另一个帐户
function transfer(address _to, uint256 _amount) returns (bool success) {
//判断条件 发送者余额>=要发送的值 发送的值>0 接收者余额+发送的值>接收者的余额
if (balances[msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[msg.sender] -= _amount; //发送者的余额减少
balances[_to] += _amount; //接收者的余额增加
return true;
} else {
return false;
}
}
// 发送 _value 数量的token从地址 _from 到 地址 _to
// transferFrom方法用于提取工作流程,允许合同以您的名义发送令牌,例如“存入”到合同地址和/或以子货币收取费用; 该命令应该失败,除非_from帐户通过某种机制故意地授权消息的发送者; 我们提出这些标准化的API来批准:
function transferFrom(
address _from,
address _to,
uint256 _amount
) returns (bool success) {
//和上面一样的校验规则
if (balances[_from] >= _amount
&& allowed[_from][msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[_from] -= _amount;
allowed[_from][msg.sender] -= _amount; //减少发送者的批准量
balances[_to] += _amount;
return true;
} else {
return false;
}
}
// 允许_spender多次退出您的帐户,直到_value金额。 如果再次调用此函数,它将以_value覆盖当前的余量。
function approve(address _spender, uint256 _amount) returns (bool success) {
allowed[msg.sender][_spender] = _amount; //覆盖当前余量
return true;
}
}
http://blog.csdn.net/diandianxiyu_geek/article/details/78082551?utm_source=gold_browser_extension
以太坊 | 评论:0
| Trackbacks:0
| 阅读:372
Submitted by admin on 2017, December 24, 3:53 PM
今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过;但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识。今天就我的一些理解,整理一下这个问题,并希望以后这样的课程能多点。
先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。然而,作为活动商品,库存肯定是很有限的,如何控制库存不让出现超买,以防止造成不必要的损失是众多电子商务网站程序员头疼的问题,这同时也是最基本的问题。
从技术方面剖析,很多人肯定会想到事务,但是事务是控制库存超卖的必要条件,但不是充分必要条件。
举例:
总库存:4个商品
请求人:a、1个商品 b、2个商品 c、3个商品
程序如下:
beginTranse(开启事务)
try{
$result = $dbca->query('select amount from s_store where postID = 12345');
if(result->amount > 0){
//quantity为请求减掉的库存数量
$dbca->query('update s_store set amount = amount - quantity where postID = 12345');
}
}catch($e Exception){
rollBack(回滚)
}
commit(提交事务)
以上代码就是我们平时控制库存写的代码了,大多数人都会这么写,看似问题不大,其实隐藏着巨大的漏洞。数据库的访问其实就是对磁盘文件的访问,数据库中的表其实就是保存在磁盘上的一个个文件,甚至一个文件包含了多张表。例如由于高并发,当前有三个用户a、b、c三个用户进入到了这个事务中,这个时候会产生一个共享锁,所以在select的时候,这三个用户查到的库存数量都是4个,同时还要注意,mysql innodb查到的结果是有版本控制的,再其他用户更新没有commit之前(也就是没有产生新版本之前),当前用户查到的结果依然是就版本;
然后是update,假如这三个用户同时到达update这里,这个时候update更新语句会把并发串行化,也就是给同时到达这里的是三个用户排个序,一个一个执行,并生成排他锁,在当前这个update语句commit之前,其他用户等待执行,commit后,生成新的版本;这样执行完后,库存肯定为负数了。但是根据以上描述,我们修改一下代码就不会出现超买现象了,代码如下:
beginTranse(开启事务)
try{
//quantity为请求减掉的库存数量
$dbca->query('update s_store set amount = amount - quantity where postID = 12345');
$result = $dbca->query('select amount from s_store where postID = 12345');
if(result->amount < 0){
throw new Exception('库存不足');
}
}catch($e Exception){
rollBack(回滚)
}
commit(提交事务)
另外,更简洁的方法:
beginTranse(开启事务)
try{
//quantity为请求减掉的库存数量
$dbca->query('update s_store set amount = amount - quantity where amount>=quantity and postID = 12345');
}catch($e Exception){
rollBack(回滚)
}
commit(提交事务)
=====================================================================================
1、在秒杀的情况下,肯定不能如此高频率的去读写数据库,会严重造成性能问题的
必须使用缓存,将需要秒杀的商品放入缓存中,并使用锁来处理其并发情况。当接到用户秒杀提交订单的情况下,先将商品数量递减(加锁/解锁)后再进行其他方面的处理,处理失败在将数据递增1(加锁/解锁),否则表示交易成功。
当商品数量递减到0时,表示商品秒杀完毕,拒绝其他用户的请求。
2、这个肯定不能直接操作数据库的,会挂的。直接读库写库对数据库压力太大,要用缓存。
把你要卖出的商品比如10个商品放到缓存中;然后在memcache里设置一个计数器来记录请求数,这个请求书你可以以你要秒杀卖出的商品数为基数,比如你想卖出10个商品,只允许100个请求进来。那当计数器达到100的时候,后面进来的就显示秒杀结束,这样可以减轻你的服务器的压力。然后根据这100个请求,先付款的先得后付款的提示商品以秒杀完。
3、首先,多用户并发修改同一条记录时,肯定是后提交的用户将覆盖掉前者提交的结果了。
这个直接可以使用加锁机制去解决,乐观锁或者悲观锁。
乐观锁,就是在数据库设计一个版本号的字段,每次修改都使其+1,这样在提交时比对提交前的版本号就知道是不是并发提交了,但是有个缺点就是只能是应用中控制,如果有跨应用修改同一条数据乐观锁就没办法了,这个时候可以考虑悲观锁。
悲观锁,就是直接在数据库层面将数据锁死,类似于oralce中使用select xxxxx from xxxx where xx=xx for update,这样其他线程将无法提交数据。
除了加锁的方式也可以使用接收锁定的方式,思路是在数据库中设计一个状态标识位,用户在对数据进行修改前,将状态标识位标识为正在编辑的状态,这样其他用户要编辑此条记录时系统将发现有其他用户正在编辑,则拒绝其编辑的请求,类似于你在操作系统中某文件正在执行,然后你要修改该文件时,系统会提醒你该文件不可编辑或删除。
4、不建议在数据库层面加锁,建议通过服务端的内存锁(锁主键)。当某个用户要修改某个id的数据时,把要修改的id存入memcache,若其他用户触发修改此id的数据时,读到memcache有这个id的值时,就阻止那个用户修改。
5、实际应用中,并不是让mysql去直面大并发读写,会借助“外力”,比如缓存、利用主从库实现读写分离、分表、使用队列写入等方法来降低并发读写。
mysql/db | 评论:0
| Trackbacks:0
| 阅读:353
Submitted by admin on 2017, December 23, 2:36 AM
- fmt.Println(time.Now().Unix()) //获取当前秒
- fmt.Println(time.Now().UnixNano())//获取当前纳秒
- fmt.Println(time.Now().UnixNano()/1e6)//将纳秒转换为毫秒
- fmt.Println(time.Now().UnixNano()/1e9)//将纳秒转换为秒
- c := time.Unix(time.Now().UnixNano()/1e9,0) //将毫秒转换为 time 类型
- fmt.Println(c.String()) //输出当前英文时间戳格式
golang | 评论:0
| Trackbacks:0
| 阅读:329
Submitted by admin on 2017, December 15, 11:42 AM
hardcode 一些基础样式在主文档里面。 比如loading动画或者基础背景色。
在bundle.js请求没有回来之前,有较好的等待效果,而这段样式无需异步加载。
加载慢原因:
1、bundle太大,没有压缩混淆。
2、bundle没有使用异步模块加载。
3、bundle没有拆分css样式或者base64了图片。
以上都可以对症下药
--------------
(1)给个loading菊花挡一下
(2)考虑对于页面的组件做异步加载
(4)webpack打包优化,减小打包文件体积大小
(3)vuejs路由的懒加载策略
(5)配置vue-cli,利用webpack插件完成模板预加载
(6)考虑服务器渲染首屏骨架页面,或者更复杂的服务器渲染策略ssr,官方有文档
上面5种,实现难度都是逐级增加
https://segmentfault.com/q/1010000011823965
前端 | 评论:0
| Trackbacks:0
| 阅读:372
Submitted by admin on 2017, December 13, 8:32 PM
http://blog.csdn.net/fidelhl/article/details/50654813
http://blog.csdn.net/yooliee/article/details/72818932
http://www.jianshu.com/p/c53ede8fab36
以太坊 | 评论:0
| Trackbacks:0
| 阅读:382
Submitted by admin on 2017, December 12, 2:54 PM
1、在64系统里执行32位程序如果出现/lib/ld-linux.so.2:
bad ELF interpreter: No such file or directory,安装下glic即可
yum install glibc.i686
2、error while loading shared libraries: libz.so.1:
cannot open shared object file: No such file or directory
yum install zlib.i686
linux | 评论:0
| Trackbacks:0
| 阅读:371
Submitted by admin on 2017, December 11, 3:20 PM
教练,我“只”想学`solidity`
http://liyuechun.org/2017/09/03/solidity-MetaMask/
以太坊 | 评论:0
| Trackbacks:0
| 阅读:376
Submitted by admin on 2017, December 11, 12:10 PM
杂七杂八 | 评论:0
| Trackbacks:0
| 阅读:378