EOS纯数字账户问题

今天碰到一个有意思的问题,特意拿出来分享一下。

我们知道EOS账户是由 .、1-5、a-z这32个字符中组成,且长度不超过12个字符;EOS账户,本质上是一个64位无符号整型,也就是在实际转换过程中5位转换成一个字符,64 / 5 = 12(这里是整型计算),这也就是为什么账户长度为什么为12的原因,具体转换函数我们其实可以看name.hpp头文件,其实就是做了一次base32编码(这里不具体介绍)。

最初版的EOS中账户类型为account_name类型(即uint64_t类型),后来eosio.cdt中定义了name结构类型(该结构体主要变量为uint64_t类型的变量value)。

所以有时候我会选择以账户名作为多索引表的主键,准确来说是使用账户名的value变量作为主键,假设定义多索引表如下:

1 TABLE test {
2     name        account;
3     uint32_t    score;
4
5     uint64_t    primary_key() const { return account.value; }
6 };
7 typedef eosio::multi_index<"test"_n, test>    test_t;

从以上代码中我们可以看到,主键为account.value,即账户名的value值。

这个时候,如果我通过api来查询该表格的某条数据,通过设置主键的上下限来唯一确定这条数据:

curl --request POST --url http://rpc.eosio.com/v1/chain/get_table_rows --data ‘{"scope":"testaccount1","code":"testaccount1","table":"test","json":"true","lower_bound":"111111111111","upper_bound":"111111111111"}‘

假设test表格中确实存在账户名为111111111111的数据记录,但使用以上命令查询时却返回为空。这是为什么呢?

究其原因,当我们传入纯数字账户名时,系统会将其作为一个uint64_t类型处理,而并不是作为一个字符串类型处理。也就是会优先调用uint64_t作为传入参数的构造函数。所以如果我们在对纯数字类型账户名使用api进行索引时,需要给账户加上空格前缀或者空格后缀,实际测试中,发现非纯数字类型账户名也是可以加空格的,因此以上api命令需要修改为,前面加空格:

curl --request POST --url http://rpc.eosio.com/v1/chain/get_table_rows --data ‘{"scope":"testaccount1","code":"testaccount1","table":"test","json":"true","lower_bound":" 111111111111","upper_bound":" 111111111111"}‘

或者后面加空格:

curl --request POST --url http://rpc.eosio.com/v1/chain/get_table_rows --data ‘{"scope":"testaccount1","code":"testaccount1","table":"test","json":"true","lower_bound":"111111111111 ","upper_bound":"111111111111 "}‘

或者混合使用:

curl --request POST --url http://rpc.eosio.com/v1/chain/get_table_rows --data ‘{"scope":"testaccount1","code":"testaccount1","table":"test","json":"true","lower_bound":"111111111111 ","upper_bound":" 111111111111"}‘

  

原文地址:https://www.cnblogs.com/tkblack/p/11369265.html

时间: 2024-10-18 16:30:07

EOS纯数字账户问题的相关文章

java纯数字加密解密实例

我们都知道,在用户加入信息时,一些比較敏感的信息,如身份证号,手机号,用户的登录password等信息,是不能直接明文存进数据库的.今天我们就以一个详细的样例来说明一下纯数字的java加密解密技术. 一般我们从页面获取到用户加入的信息之后,进行加密然后存入到数据库.须要比对信息时,加密之后的用户信息我们看不懂,所以相应的我们就要用解密技术.事实上软考中对加密解密技术进行了非常全面的说明,这里我们就用一个比較简单的实例来说明一下. 我们可能会习惯在service层进行加密,这个没有太强制的要求.以

javascript中,如何判断input中输入的为纯数字

用正则表达式判断.如果纯数字是指整数的话(不包含小数点),可以这样: function check(){ var value = document.getElementById("inputId").value; var reg=/^[1-9]\d*$|^0$/; // 注意:故意限制了 0321 这种格式,如不需要,直接reg=/^\d+$/; if(reg.test(value)==true){ alert("都是数字!通过"); return true; }e

判断是不是纯数字字符串

判断一个字符串是不是纯数字字符串 注:1.当字符串首位是0的时候,如"-0123345"或者"01232345",此处认为是合法的纯数字字符串 2.当字符串全部是0的时候,如"0000",此处也认为是合法的纯数字字符串 1 bool IsAllDigit(const std::string &sConnect) 2 { 3 if (sConnect.empty() ) 4 { 5 return false; 6 } 7 8 std::st

iOS判断字符串是否为手机号,iOS判断字符串是是否为字符串,iOS判断字符串是否为纯数字

#pragma 正则匹配手机号 + (BOOL)isPhoneNumber:(NSString *)str { if ([str length] == 0) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"提示"message:@"请输入手机号码" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]

纯数字验证码

登录时常常要用到验证码验证,下面是一个简单的纯数字验证码,详细代码见image.jsp,将每次生成的验证码文本直接存入session中,登录时方便后台从session中取值验证: <%@ page contentType="image/jpeg" import="java.awt.*, java.awt.image.*,java.util.*,javax.imageio.*" pageEncoding="utf-8"%> <%!

Asp.net,C# 纯数字加密解密字符串

也就是说加密后的数据不再是:N8lAaHMFtSAQgaf3+RUFng== 希望encryptedString是"120387789370480938409832840923492384028934…”; 当然上面的数字是我随便乱敲的. 那么如何实现纯数字呢?? 想法很简单,只要将字符变成Ascll 码就可以了.例如a:97, =:61; 那么encryptedString 就可以变成 97 81 61 33 44 55 ...; 但是如果合在一起的话就变成了978161334455. 问题来

判断输入的字符串是否为 纯数字 还是 纯字母

汇总: NSScanner: NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串.可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符. NSCharacterSet:主要用来判断已知字符串是否包含制定字符集,而不可以用来保存字符串. 1.使用NSScanner来判断 //判断是否为整形: - (BOOL)isPureInt:(NSString*)string{ NSScanner

检货装箱单界面中录入纯数字条码显示问题

检货装箱单界面中录入纯数字条码显示问题 问题:数据库中拿出的xml是没有问题,但是js解析的时候,如果是纯数字,就会自动把它当成数字,但是数字太长太大,导致eval解析出错 分析:nds.control.ejb.command.DBJSONXML.class中,用org.json.XML.toJSONObject(string)方法是电脑自己判断类型,纯数字自动判断为数字类型,现在需要将数据库拿取的xml格式的值全部变成String 类型,用net.sf.json.xml.XMLSerializ

input框只能输入纯数字+格式化输入金额与银行卡JS代码

HTML页面代码示例: <div class="wrap">   <input type="text" id="bankCard" placeholder="输入银行卡号"> </div>   <div class="wrap">   <input type="text" id="moneyNum" placeho