URL地址:https://developers.eos.io/welcome/latest/index
账户,保存在链上。需要一个帐户以转移或推动任何有效的交易到区块链。
钱包
授权和权限
Delegated Proof of Stake (DPOS)
RAM,需要购买
CPU,CPU是一种瞬态系统资源
Network (NET)
WebAssembly C++ Compilation
Programmable Economics and Governance
任何基于EOSIO的块链的资源分配和治理机制都是通过智能契约来编程的。您可以修改系统智能契约以自定义EOSIO块链的资源分配模型和治理规则。链上治理机制可以使用系统智能契约进行修改,因此并不总是需要更新核心层代码才能进行更改。
Staking Mechanism(成桩机制)
在基于EOSIO的块链中,对系统资源的访问是由一种称为成桩机制的过程来调节的。属于成桩机制范围内的系统资源是CPU和Net。您可以通过closCLI、RPCAPI或通过抵压系统TOKENS访问CPU和网络的应用程序直接与区块链进行交互。
注意:RAM是EOSIO块链上的一个持久系统资源,不属于成桩机制的范围。
当您为CPU和Net使用令牌时,您可以访问系统资源,这与所有其他用户同时为同一资源所抵压的令牌总量成正比。这意味着您可以免费执行事务,但需要考虑到抵压令牌的限制。无论自由市场中的任何变化,有桩的令牌都能保证资源的比例。
业务模式灵活性(Business Model Flexibility)
构建在EOSIO上的应用程序可以采用一个免费的模型,在这个模型中,应用程序用户不需要支付执行事务所需的资源成本。
在Freemium模型下,通过应用程序与用户共同签署交易,可以方便无成本交易的执行。或者,应用程序也可以使用足够的系统令牌来保证所需的资源。
综合许可模式(Comprehensive Permission Schema)
EOSIO平台有一个全面的权限系统,用于为各种用例创建自定义权限模式。例如,您可以创建自定义权限并使用它来保护智能契约的特定功能。您还可以将修改智能契约所需的权限拆分到具有不同权限级别的多个帐户中。这个全面的许可系统允许您在灵活的基础设施之上构建一个许可的应用程序。
可升级性(Upgradability)
部署在基于EOSIO的块链上的应用程序是可升级的。这意味着只要提供了足够的权限,您就可以部署代码修复、添加特性和更改应用程序的逻辑。作为开发人员,您可以迭代您的应用程序,而不会被永久锁定到软件错误中。但是,也有可能部署不能在基于EOSIO的块链上修改的智能契约。这些决定由开发人员自行决定,而不是受协议的限制。
有效能耗(Efficient energy consumption)
使用DPO作为协商一致机制,与其他协商一致算法相比,EOSIO在验证事务和保护块链方面消耗的能量要少得多。
EOSIO智能合同基础(EOSIO Smart contract fundamentals)
内联行为(Inline actions)
自定义权限(Custom Permission)
使用EOSIO通知声明的应付操作(Payable actions using EOSIO notify declarations)
这种方法是由Gitpod.io和Docker提供的,它为开发人员提供了一个个人的单节点EOSIO块链,用于从您的Web浏览器访问Gitpod.io的云中进行开发和测试。
Step 1: Create a Wallet
关于钱包:
密码货币中关于钱包的一个常见误解是它们存储令牌。然而,在现实中,钱包被用来将私钥存储在加密的文件中,以签署交易。钱包不作为令牌的存储介质。
Step 2: Open the Wallet
Step 3: Unlock it
Step 4: Import keys into your wallet
Step 5: Follow this tutorial series more easily
Step 6: Import the Development Key
每个新的EOSIO链都有一个名为“eosio”的默认“System”用户。此帐户用于通过加载系统契约来设置该链,这些合同规定了EOSIO链的治理和协商一致。每个新的EOSIO链都带有一个开发密钥,这个密钥是相同的。加载此密钥以代表系统用户(Eosio)对事务进行签名。
cleos wallet import
将提示您输入一个私钥,输入下面提供的eosio开发密钥
5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
重要:
不要将此开发密钥用于生产帐户!这样做肯定会导致您无法访问您的帐户,这个私钥是公开的。
很好,您现在有一个默认的钱包打开并装载一个密钥,并准备继续。
这些设置完成以下操作:
Run Nodeos. This command loads all the basic plugins, set the server address, enable CORS and add some contract debugging and logging.
Enable CORS with no restrictions (*) and development logging
In the above configuration, CORS is enabled for * for development purposes only, you should never enable CORS for * on a node that is publicly accessible!
Step 2.3: Check Nodeos endpoints
http://localhost:8888/v1/chain/get_info
帐户是授权的集合,存储在区块链上,用于标识发件人/收件人。它具有灵活的授权结构,根据权限的配置方式,它可以由个人或一组个人拥有。需要帐户才能向区块链发送或接收有效的事务。
本系列教程使用两个“用户”帐户,bob和alice,以及用于配置的默认eosio帐户。此外,在整个教程系列中,对各种合同都作了说明。
cleos create account eosio bob EOS6Kc7LVUHVxauut2rj8Rwk21mXAYpvLoNsJf3C1vFLFjhGeeHHM
cleos get account alice
注意:default钱包必须解锁
注在cleos命令中,公钥与帐户Alice相关联。每个EOSIO帐户都与一个公钥相关联。请注意,帐户名称是唯一的所有权标识符。您可以更改公钥,但它不会更改EOSIO帐户的所有权。
使用“cleos get account alice”检查哪个公钥与Alice关联。
在本教程中,在生产网络上为Active/Owner使用不同的密钥,我们为所有者使用相同的公钥,为简单起见使用相同的公钥。在生产网络中,强烈推荐两种不同的密钥。
eosio-cpp hello.cpp -o hello.wasm
Step 1: Obtain Contract Source
Step 2: Create Account for Contract
cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
Step 3: Compile the Contract
eosio-cpp -I include -o eosio.token.wasm src/eosio.token.cpp --abigen
Step 4: Deploy the Token Contract
cleos set contract eosio.token /home/king/eosio/contracts/eosio.contracts/contracts/eosio.token --abi eosio.token.abi -p eosio.token@active
Step 5: Create the Token
cleos push action eosio.token create ‘[ “alice”, “1000000000.0000 SYS”]’ -p eosio.token@active
Step 6: Issue Tokens
cleos push action eosio.token issue ‘[ “alice”, “100.0000 SYS”, “memo” ]’ -p alice@active
Step 7: Transfer Tokens
cleos push action eosio.token transfer ‘[ “alice”, “bob”, “25.0000 SYS”, “m” ]’ -p alice@active
以前,您使用提供的ABI文件部署eosio.Token协议。本教程将概述ABI文件如何与eosio.Token合同相关。可以使用eosio.cdt提供的eosio-cpp实用程序生成ABI文件。然而,有几种情况可能导致ABI产生故障或完全失败。高级C++模式可能会出错,而自定义类型有时会导致ABI生成问题。因此,您必须了解ABI文件是如何工作的,因此您可以在必要时进行调试和修复。
应用程序二进制接口(ABI)是一种基于JSON的描述,描述如何在JSON和二进制表示之间转换用户操作。ABI还描述了如何将数据库状态与JSON互相转换。一旦您通过ABI描述了您的合同,那么开发人员和用户将能够通过JSON无缝地与您的合同进行交互。
Security Note
在执行事务时可以绕过ABI。传递给合同的消息和操作不必符合ABI。ABI是一个向导,而不是一个看门人。
ABI允许任何客户端或接口为您的合同解释甚至生成GUI。要使其一致工作,请描述在任何公共操作或结构中需要在ABI中描述的用作参数的自定义类型。
typedef eosio::multi_index< “accounts”_n, account > accounts;
typedef eosio::multi_index< “stat”_n, currency_stats > stats;
Vectors
Struct Base
Extra ABI Properties
Ricardian Clauses
李嘉图条款描述特定行动的预期结果。它还可用于确定发件人与合同之间的条款。
Maintenance
每次更改结构、添加表、向操作添加操作或添加参数、使用新类型时,都需要记住更新ABI文件。在许多情况下,忘记更新ABI文件不会产生任何错误。
要了解数据持久性,您可以编写一个简单的智能契约,作为通讯簿。虽然此用例作为生产智能契约并不十分实用,但首先要了解数据持久性是如何在EOSIO上工作的,而不受与eosio的多索引功能无关的业务逻辑的干扰。
#include
using namespace eosio;
class [[eosio::contract(“addressbook”)]] addressbook : public eosio::contract {
public:
addressbook(name receiver, name code, datastream
[[eosio::action]]
void upsert(name user, std::string first_name, std::string last_name, std::string street, std::string city, std::string state) {
require_auth( user );
address_index addresses( get_self(), get_first_receiver().value );
auto iterator = addresses.find(user.value);
if( iterator == addresses.end() )
{
addresses.emplace(user, [&]( auto& row ) {
row.key = user;
row.first_name = first_name;
row.last_name = last_name;
row.street = street;
row.city = city;
row.state = state;
});
}
else {
addresses.modify(iterator, user, [&]( auto& row ) {
row.key = user;
row.first_name = first_name;
row.last_name = last_name;
row.street = street;
row.city = city;
row.state = state;
});
}
}
[[eosio::action]]
void erase(name user) {
require_auth(user);
address_index addresses( get_self(), get_first_receiver().value);
auto iterator = addresses.find(user.value);
check(iterator != addresses.end(), "Record does not exist");
addresses.erase(iterator);
}
private:
struct [[eosio::table]] person {
name key;
std::string first_name;
std::string last_name;
std::string street;
std::string city;
std::string state;
uint64_t primary_key() const { return key.value; }
};
using address_index = eosio::multi_index<“people”_n, person>;
};
cleos set contract addressbook /home/king/eosio/contracts/addressbook -p addressbook@active
cleos push action addressbook erase ‘[“alice”]’ -p alice@active
cleos get table addressbook addressbook people --lower alice --limit 1