EOS智能合约开发(三)EOS创建和管理账户

article/2025/9/12 22:30:24

创建好钱包和密钥后,我们就需要创建账户。为什么创建账户,为了方便人与区块链交互。以太坊40位地址,让我们非常难以记忆。EOS有账户概念,我们就可以定义账户权限。

在区块链上执行操作,需要使用到账号。我们使用cleos向nodeos发起请求来创建账号并且将账号发布到区块链中。在执行创建账号操作之前,我们必须确保nodeos处于运行状态。在后面的例子中,我们需要在一台机器上同时运行keosd和nodeos两个进程,而上述两个进程默认配置的端口都是8888,因此需要进行简单修改确保keosd和nodeos运行在不同端口上。

通常有两种方式可以将keosd的端口改为8899:
1 . 进入钱包文件所在的目录,并将config.ini文件中的端口改为8899,保存配置文件并重启keosd。

$ cd ~/eosio-wallet
$ vim config.ini
# 修改端口为8899,保存并退出vim
$ pkill keosd
$ keosd

2 .使用keosd命令行参数

$ pkill keosd
$ keosd --http-server-address=localhost:8899

或者通过cleos携带"–wallet-port=8899"执行钱包操作

$ cleos --wallet-port=8899 wallet unlock

要启动nodeos,打开一个终端窗口,找到nodeos可执行文件所在的目录,执行:

$ cd eos/build/programs/nodeos
$ ./nodeos -e -p eosio --max-transaction-time=1000 --plugin eosio::wallet_api_plugin --plugineosio::chain_api_plugin --plugin eosio::account_history_api_plugin --plugin eosio::producer_plugin --plugin eosio::net_plugin

现在我们可以使用"cleos create account"创建一个账号了。

$ cleos create account eosio ${new_account} ${owner_key} ${active_key}
#或者
$ cleos create account ${authorizing_account} ${new_account} ${owner_key} ${active_key}
  • authorizing_account: 授权的账号名称,用来支付账号创建以及后续其他新账号的费用。
  • new_account:希望创建的新账号
  • owner_key:拥有拥有者权限的账号的公钥(详见账号与权限)
  • active_key:希望分配给活跃权限公钥

在这里,“eosio”是一个可授权账号。当在区块链上进行操作时必须使用eosio账号进行签名。eosio账号同时还是特殊的账号用来启动EOSIO节点,它的密码对信息信息可以在nodeos的配置文件中找到(默认在 “~/.local/shared/eosio/config/config.ini”).
至于这两个认证,我后面会给详细介绍,这是两个主要的权限。我创建一个账号,如果这个账号要有Owner的权限和Active的权限,就必须要用这两个key才能实现。
我们需要为新账号定一个名称。账号名称必须遵循以下两个准则:

必须短于13个字符
仅能包含以下字符:.12345abcdefghijklmnopqrstuvwxyz
我们采用“myaccount”作为新账号名称

介绍Owner key和Active key的概念。
Owner key的概念就是你账号的所有控制权限,你只要有了Owner key,你可以对这个账号的任何东西做任何的事儿,这是它的所有控制权。
而Active key只掌握了你的账号资金的访问权限,也就是你如果有了Active这个权限的话,你可以对这个账号的资金进行转移,但是你不能转移这个账号的所有权,或者不能做超过这个Active权限其它的权利。
简单的理解,Owner key就是对这个账号的最高权限,Active只是用来转移资金而已。这也是与以太坊智能合约开发的一个区别,以太坊账号的权限其实没有这么细分,它就只有一个账号,我只要有这个账号的公钥和私钥,我就可以做任何事情。

注意:导入初始账户eosio的主秘钥到钱包非常关键

  • 所有新的blockchains,都是通过主秘钥启动,唯一初始账户:eosio。要与区块链交互,需要将这个初始账户的私钥导入到你的钱包。
  • 这个主秘钥是在~/.local/share/eosio/nodeos/config文件夹下的config.ini文件中自动配置的(可修改,默认安装EOS会生成一个)。
  • Private key should be encoded in base58 WIF。所以上篇文章中经常出现的WIF的意思是一种base58编码方式。
# 值为[公钥,私钥WIF编码的]
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

我们从创建钱包,创建私钥,创建账号做一个流程,命令如下:

#创建两个私钥
cuijb@cuijb-VirtualBox:~$ cleos create key --to-console
Private key: 5KVHPyt2k95JAc7hJuVVHu1BoWaKYUgzSaNpcFEjGK7eXsh1wfY
Public key: EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG
cuijb@cuijb-VirtualBox:~$ cleos create key --to-console
Private key: 5KiLgUMzRSwkfh6qm8kDUDY9dCxBs6LDh7ayu92VVaE1gryeYsN
Public key: EOS6yEfHLXgWkR24CxL1SH9EsDVa83jdtmXQvz9Ahy3gJJuqFGSEH
#创建钱包
cuijb@cuijb-VirtualBox:~$ cleos wallet create -n gxk --to-console
Creating wallet: gxk
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5KdyyBpCX7qShsniZnUT1CRd1anJqvQooDVBYHNUSuPYqc8vTt8"
#将私钥导入钱包
cuijb@cuijb-VirtualBox:~$ cleos wallet import --private-key  5KVHPyt2k95JAc7hJuVVHu1BoWaKYUgzSaNpcFEjGK7eXsh1wfY -n gxk
imported private key for: EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG
cuijb@cuijb-VirtualBox:~$ cleos wallet import --private-key 5KiLgUMzRSwkfh6qm8kDUDY9dCxBs6LDh7ayu92VVaE1gryeYsN -n gxk
imported private key for: EOS6yEfHLXgWkR24CxL1SH9EsDVa83jdtmXQvz9Ahy3gJJuqFGSEH#注意!默认账号eosio需要导入私钥,必须执行以下代码。
#必须导入5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 
#所有新的blockchains,都是通过主秘钥启动,唯一初始账户:eosio。要与区块链交互,需要将这个初始账户的私钥导入到你的钱包。
#private-key可以再~/.local/share/eosio/nodeos/config文件夹下的config.ini找到。cuijb@cuijb-VirtualBox:~$ cleos wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 -n gxk
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
#开始创建 账户 myaccount 
cuijb@cuijb-VirtualBox:~$ cleos -u http://192.168.0.107:8888 create account eosio myaccount  --to-console
EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG EOS6yEfHLXgWkR24CxL1SH9EsDVa83jdtmXQvz9Ahy3gJJuqFGSEH
executed transaction: 6445ba5bf96e7534c8f6ed7255e08a3e7d2d0e822d32b4070d26d325c4abf073  200 bytes  20758 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"myaccount","owner":{"threshold":1,"keys":[{"key":"EOS8KwXkVMxwbWeKs4KyUaT...
warning: transaction executed locally, but may not be confirmed by the network yet
#开始创建 账户 myaccount1 
cuijb@cuijb-VirtualBox:~$ cleos -u http://192.168.0.107:8888 create account eosio myaccount1 --to-console
EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG EOS6yEfHLXgWkR24CxL1SH9EsDVa83jdtmXQvz9Ahy3gJJuqFGSEH
executed transaction: 721fb19a01ff14b2baa193d5d364c2defc68aedcc063f05ff9942d0e2b190fb1  200 bytes  180 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"myaccount1","owner":{"threshold":1,"keys":[{"key":"EOS8KwXkVMxwbWeKs4KyUa...
warning: transaction executed locally, but may not be confirmed by the network yet
#查询我建立的所有用户
cuijb@cuijb-VirtualBox:~$ cleos -u http://192.168.0.107:8888 get accounts  EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG --to-console
{"account_names": ["myaccount","myaccount1"]
}

注意,创建账户命令的格式是:cleos create account [OPTIONS] creator name OwnerKey
ActiveKey

  • 使用create account命令来创建账户
  • 是由账户eosio创建的
  • 待创建的账户是myaccount
  • OwnerKey,如果在生产环境中,这个值应该保持高度安全
  • ActiveKey,这是上面刚生成的密钥对中的公钥
  • 这里只是学习使用,这两个值可以设置成一个

账号相关操作

使用cleos还可以针对账号进行以下操作。

cleos命令 描述
create account 在区块链上创建新账号
get account 从区块链上获取一个账号
get code 查找一个账号的代码和ABI
get accounts 查询与一个公钥关联的账号信息
get servants 查找一个给定账号之下的服务账号
get transactions 查询与一个账号关联的所有的交易
set contract 使用一个账号创建或修改合约
set account 设置或修改区块链上账号的状态
transfer 将数字币从一个账号转账到另一个账号

EOS的权限和许可
对于EOS的权限和许可,分得非常细。
【Permission】叫做「许可」,它是一个操作允许的权限,可以建立很多permission。比如允许你转账,允许你发微博或者允许你做其他事。它是通过permission来控制你的操作,可能不同的用户有不同的permission。
Threshold是某个许可需要的阈值。比如你要做一件事儿,它可能有个阈值,这个阈值是一个量化,你必须要达到这个阈值才可以进行相应的操作。
Weight表示权重。账号必须对应某个许可拥有的权重,就是你的权重要大于你的阈值,然后这件事儿你就可以做。
在permission许可里面有两种许可:
-owner许可;
-active许可。
这两个叫native(原生)的permission,另外还有public的permission。
下面通过两个例子来解释他们之间的关系与区别:
这里写图片描述

第一个例子, owner许可的阈值是1,它里面有一个账号,这个账号是用它的公钥来代表的,然后这个账号的权重是1,这样你的权重是大于等于阈值的,所以可以用owner的账号和权限。
active许可里面有一个账号,它的权重也是等于这个阈值,所以可以用active的账号和权限。
这两个账号,一个是有owner权限,一个是有active权限,因为它们的权重和阈值是大于等于这个值的,对应的账号与权限都是可以使用的。
这里写图片描述
第二个例子,除了owner的permission之外,你还可以有一个publish permission。它们之间有什么区别呢?
当你创建任何一个账号,这个账号都有owner的许可和active的许可。其他的许可就是你可以自己定义,来让不同的用户,拥有不同的许可组合,这样就可以很灵活的去管理不同的账号。
所以这一点,EOS考虑的比较细致一点,但是以太坊或者比特币没有做到这么细致,以太坊或者比特币拥有一个账号就可以做任何事情。

这里面再细一点来讲,这里面的owner的阈值是2,bob账号的权重只有1,stracy账号的权重也只有1,如果它俩单独的去获得owner许可相关的操作,它们是获得不了的。但是,如果bob和stracy加起来大于等于2,就是这两个账号联合起来大于等于2的,这两个账号就可以做这个操作的,其实这有点像投票。
我觉得这个权限或许可的限制,和我们传统的操作系统是不太一样的。我们传统的操作系统好像没有这种联合签名可以达到两个权重来执行owner的相关操作。

active这也是一样的,如果bob账号是1,stracy账号是1,如果active需要的阈值是1的话, bob账号和stracy账号是单独都可以做active许可相关的操作,就是转移资金。
另外,publish就是一个定制化许可。我们每个用户也可以定义自己某些允许的一些操作。publish这里面的阈值是2,bob账号是2,stracy账号是2,这两个账号也可以单独做publish许可相关的操作。而publish的权限可能是比如发布一些消息、发布一些微博的操作。
通过以上两个例子,给大家展示了EOS对权限设置的设计有多细致。

2018年7月10日整理于深圳


http://chatgpt.dhexx.cn/article/sbZlEh2G.shtml

相关文章

固化EOS智能合约,监管升级权限,净化EOS DAPP生态

最近EOS版的Fomo 3D狼人杀游戏骗局引发了大家对EOS智能合约的安全性的大讨论。 和以太坊智能合约的不可升级不同&#xff0c;EOS智能合约可升级&#xff0c;因而保存在智能合约中的数据称不上去中心化&#xff0c;因为智能合约的管理员可偷偷的升级智能合约来修改合约里的任何数…

[EOS源码分析]7.EOS智能合约开发实践之合约调用合约(inline action)

首先&#xff0c;目前dawn-4.1, dawn-4.2使用inline action是会报如下错误 transaction declares authority {"actor":"hello.code","permission":"active"}, but does not have signatures for it under a provided delay of 0 ms 这…

区块链实现智能合约

区块链实现智能合约 一、制定生成智能合约 1、首先参与智能合约的用户必须先注册成为区块链的用户&#xff0c;区块链返回给用户一对公钥和私钥。公钥做为用户在区块链上的账户地址&#xff0c;私钥做为操作该账户的唯一钥匙。 2、两个以两个以上的用户根据需要&#xff0c;…

以太坊中的智能合约

以太坊中的智能合约&#xff08;Smart Coantract&#xff09; 创建智能合约 以太坊中的智能合约是运行在区块链上的一段代码&#xff0c;代码的逻辑定义了合约的内容。合约的账户保存了合约当前的运行状态&#xff0c;主要包含了4部分内容。 balance&#xff1a;当前余额non…

智能合约(一)————智能合约入门

1、智能合约的基本组成 1.1.程序版本 1.2. 合约声明 1.3.状态变量 1.4.合约方法 在这里constant相当于他声明这个局部变量不能更改&#xff0c;但是他并没有实际作用&#xff08;实际就只是警示作用&#xff09;2、地址adress - address.balance 账户余额 - adress.transfe…

EOS 智能合约源代码解读 (10)token合约“简介”

1. 记录用户的token&#xff0c;比如有哪些代币 class [[eosio::contract("eosio.token")]] token : public contract {public:using contract::contract;[[eosio::action]]void _create( const text_name& issuer, const asset& maximum_supply);[[eosi…

区块链智能合约介绍

作者&#xff1a;qinyutong、chengyueqiang 智能合约 (smart contract) 是一种由事件驱动的、具有状态的代码合约和算法合同 [11]&#xff0c;随着以比特币为代表的区块链技术的蓬勃发展, 区块链技术已经开始逐步超越可编程货币时代而进入智能合约时代。智能合约作为区块链的核…

智能合约简介

区块链技术简史 区块链技术的第一次应用是在2008年&#xff0c;当时比特币首次亮相。抛弃传统金融机构&#xff0c;比特币引入了促进数字金融交易的新方法。然而&#xff0c;尽管在当时这是革命性的举措&#xff0c;但在这种状态下&#xff0c;区块链技术无法得到广泛应用。 区…

十分钟教你开发EOS智能合约

在CSDN、柏链道捷&#xff08;PDJ Education&#xff09;、HelloEOS、中关村区块链产业联盟主办的「EOS入门及最新技术解读」专场沙龙上&#xff0c;柏链道捷&#xff08;PDJ Education&#xff09;CTO、副总裁康烁&#xff0c;作了「如何在EOS上开发智能合约」的精彩演讲。演讲…

智能合约--如何实现可升级的智能合约

一. 什么是智能合约 智能合约通俗点说就是写在区块链上面的代码&#xff0c;代码里面编写着严谨完善的规则&#xff0c;一旦某个用户满足了合约里面的规则条件&#xff0c;就会触发里面的代码&#xff0c;执行某个方法。 二. 为什么要使智能合约达到可升级 智能合约的特点之一…

智能合约简单介绍

本学期学习了区块链的课程&#xff0c;作业是对于智能合约学习后的报告&#xff1a; 1 智能合约简单了解 1.1智能合约是什么 智能合约是由事件驱动的、具有状态的、部署于可共享的分布式数据库上的计算机程序&#xff0c;多用IF-THEN语句。狭义来说&#xff0c;智能合约是设计…

智能合约

智能合约&#xff08;英语&#xff1a;Smart contract &#xff09;是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。[1]智能合约概念于1994年由Nick Szabo首次提出。智能合同的目的是提供…

[EOS源码分析]6.EOS特殊智能合约eosio

这里说的eosio智能合约不是泛指eos的智能合约&#xff0c;它是一个特殊的具体的合约。它本事可大了&#xff0c;我们一起来看看它有哪些功能 负责智能合约部署 大家有注意到如下红色字体的log吗 $ cleos set contract hello.code ../eos-contract/hello -p hello.code Publish…

EOS智能合约开发(一)

一、 智能合约功能二、 通讯模式 2.1 运行机制2.2 内联通信2.3 延迟通信2.4 交易和动作2.5 交易确认2.6 动作处理程序和动作的apply上下文2.7 交易限制 三、文件结构 3.1 创建框架3.2 apply处理程序3.3 EOSIO_ABI 宏 四、多索引数据库API 4.1 EOSIO多索引API4.2 EOSIO多索引迭代…

EOS系列 - WASM智能合约 - 特性

构造函数 addressbook(name receiver, name code, datastream<const char*> ds):contract(receiver, code, ds) {}#单例表&#xff08;code和scope都用receiver的表&#xff09;也可在初始化列表中实例化 singleton_example( name receiver, name code, datastream<c…

EOS智能合约开发(十五)EOS 状态机架构解析

好久没有写文章了&#xff0c;最近公司事情比较忙。非常感谢上次杭州团队一位负责EOS状态机的同事精彩分享。今天查阅很多资料后&#xff0c;整理这篇文章&#xff0c;希望对大家有所帮助。 EOS状态机是什么&#xff1f; 简单讲就是数据库&#xff0c;是EOS记录智能合约执行结…

接口测试时,输入所有参数的参数值后,接口返回“参数错误:所有参数都不能为空”

问题原因&#xff1a; 参数名称输入有误&#xff0c;前台&#xff08;pwd&#xff09;和后台&#xff08;password&#xff09;的参数名称不一致 &#xff0c;保持一致后即可

matlab 错误使用 connector.internal.autostart.run输入参数的数目不足。

matlab打开后提示&#xff1a; 错误使用 connector.internal.autostart.run输入参数的数目不足 原因&#xff1a;自己写的一个函数和matlab自带的函数重名了 参考&#xff1a;警告: 在 matlabrc 中初始化 Java 首选项失败 – MATLAB中文论坛MATLAB中文论坛MATLAB 基础讨论板块…

Matlab 自带遗传算法函数 ga() 运行报错:“ fitnessfcn() 输入参数的数目不足。”

原始程序 %主程序 m [1 2]; R [1.5 1]; epsilon [2^R(1)-1 2^R(2) - 1]; A [-1 epsilon(1); 0 -1]; b [0 0]; Aeq [1 1]; Beq 1;%matlab自带函数包 [x_optimal, fval] ga(fitnessfcn, 2, A, b, Aeq, Beq, [0;0], [1;1], []); ---------------------------------…