实例分析+ 实践步骤,手把手教你编写以太坊、EOS智能合约!
来源 | 《人人都懂区块链》
作者 | Carol
出品 | 区块链大本营(blockchain_camp)
教父是黑白两道通吃的大佬。
绑匪和富豪都相信教父。
富豪建立智能钱包;
绑匪用自己的私钥解锁;
仲裁者调用智能合约函数;
函数触发,将资金转移到合约当中,等待回调发生。
要约的有效条件有以下三点。
要约必须是特定人的意思表示。
要约必须是向相对人发出的意思表示。要约的相对人应为特定的人,但在特殊情况下也可以为不特定的人。
要约必须是能够反映所要订立合同主要内容的意思表示。
当事人双方相互约定,双方当事人有合作意向后就合约的内容不断探讨交流,最后形成合作的一致意见。
合同起草。有了明确的合作意见后,就敲定合约的细节,由双方当事人或者第三方( 被双方所承认的)来着手合约的起草,完成合约的书面文本 后,由双方当事人确认合约细节,确认无误后方可。
专业人员评估。完成合约起草后,还需要合约有关专业人员( 如律师) 来确认合约本身的合法性,公证处对合同进行公证备案。
合同执行。合同执行主要靠当事人双方自觉执行,如出现违约等情况, 双方当事人应相互协商解决,协商后依旧无法解决的,可申请仲裁或上诉法 院,法院判决后强制执行。
第一步,启动一个区块链节点。
第二步,使用编程语言编译智能合约,然后将源代码编译获得二进制代码。
第三步,将编译好的合约部署到网络,获得合约的区块链地址和ABI 。(这一步可能会消耗费用,还需要使用节点的默认地址或者指定地址来给合约签名。)
第四步,用JavaScript API来调用合约。(根据调用的类型有可能会消耗费用)
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum sudo add-apt-repository -y ppa:ethereum/ethereum-dev sudo apt-get update
sudo apt-get install Ethereum
sudo add-apt-repository ppa:ethereum/ethereum-qt sudo add-apt-repository ppa:ethereum/ethereum sudo apt-get update
sudo apt-get install cpp-ethereum
geth account new
ethereumjs-lib:JavaScript 语言实现;
Ethereum(J):Java 语言实现;
ethereumH:Haskell 语言实现;
go-ethereum:Go 语言实现;
Parity:Rust 语言实现;
pyethapp:Python 语言实现;
ruby-ethereum:Ruby 语言实现。
① 智能合约地址Address。
② 智能合约ABI。ABI其实就是一个有序的用户手册,描述了所有方法的名字和如何调用它们。可以使用以下代码获得其 ABI 和智能合约地址。
geiverCompiled.griver.info.abiDefinition; greeter.address;
var griver= eth.contract(ABI).at(Address);
giver.kill.sendTransaction({from:eth.accounts[0]})
struct giver{
address gaddr;//A方人地址
bool yn;//是否投票 uint}amount;//金额
struct reciever{
address raddr;//B方人地址 bool yn;//是否投票
uint amount;//金额 }
function initializeA(address giverA){ // A方人初始化
givers[giverA].amount = 1000 ether; givers[giverA].yn = true;
p1 = giverA;
givers[giverA].amount = 0 ether;
}
function initializeB(address recieverB){ // B方人初始化
recievers[recieverB].amount = 1000 ether; recievers[recieverB].yn = true;
p2 = recieverB; recievers[recieverB].amount = 0 ether; }
inthedgevalue;
function hedging1(uintexchangerate) returns (uint){ hedgevalue = 1000 ether /exchangerate ;
return hedgevalue;
}
bool success;
function hedging2(uintexchangerate ,uint time) returns(bool success){
if(time != 30) return false ;
if(givers[p1].yn == false) return false; if(recievers[p2].yn == false) return false; givers[p1].amount = hedgevalue * exchangerate;
recievers[p2].amount = 2000 ether - hedgevalue * exchangerate;
return true ;
}
EOS.IO 软件仅官方支持如下环境:
MacOS Sierra 或更高。
EOS.IO 提供了一系列工具,需要基本的命令行知识来操作它们。
{ "ref_block_num": "100", "ref_block_prefix": "14070148", "expiration": "2018-04-09T06:28:49", "scope": ["initb","initc"], "messages": [
{ "code": "eos", "type": "transfer", "authorization": [
{ "account": "initb",
"permission": "active" }
],
"data": "fbbc85598ab319612aa7f5c904b20701897722968a5
77a1229873aeb6293192b"
} ],
"signatures": [],
"authorizations": [] }
{ "ref_block_num": "100", "ref_block_prefix": "14070148", "expiration": "2018-04-09T06:28:49", "scope": [...],
"messages": [{ "code": "...",
"type": "...", "authorization": [...], "data": "..."
}, {
"code": "...",
"type": "...", "authorization": [...], "data": "..."
}, ... ],
"signatures": [],
"authorizations": [] }
获得一个 transaction 哈希并不等于 transaction 完成,它只表示该节点无报错地接受了,而其他区块生产者很可能也会接受它。但要确认该 transaction,你 需要在 transaction 历史中查看含有该 transaction 的区块数。
合约不接受浮点小数计算,因为这在 CPU 层级上是一个不确定的行为,可能会导致意想不到的分叉。
最大 30 tps。根据测试公网设置,每个账户最多每秒可发布 30 个 transactions.
$ eoscpp -n hello
① 从.cpp文件含有一个“当收到message后打印 Hello World: ${account}->${action}”的样例代码。代码如下。
oid apply( uint64_t code, uint64_t action ) { eosio::print( "Hello World: ", eosio::name(code), "->", eosio::name(action), "\n" );
}
$ eoscpp -o hello.wast hello.cpp
$ eosc set contract ${account} hello.wasthello.abi Reading WAST...
Assembling WASM...
Publishing contract...
{ "transaction_id": "1abb46f1b69feb9a88dbff881ea421fd4f399 14df769ae09f66bd684436443d5",
"processed": {
"ref_block_num": 144, "ref_block_prefix": 2192682225, "expiration": "2017-09-14T05:39:15", "scope": [
"eos",
"${account}" ],
"signatures": [ "2064610856c773423d239a388d22cd30b7ba98f6a9fbabfa621e42cec 5dd03c3b87afdcbd68a3a82df020b78126366227674dfbdd33de7d488f 2d010ada914b438"
],
"messages": [{
"code": "eos", "type": "setcode", "authorization": [{
"account": "${account}",
"permission": "active" }
],
"data": "0000000080c758410000f1010061736d010000000
1110460017f0060017e0060000060027e7e00021b0203656e760670726
96e746e000103656e76067072696e74730000030302020304040170000
00503010001071903066d656d6f7279020004696e69740002056170706
c7900030a20020600411010010b1700412010012000100041301001200
1100041c00010010b0b3f050041040b04504000000041100b0d496e697
420576f726c64210a000041200b0e48656c6c6f20576f726c643a20000
041300b032d3e000041c0000b020a000029046e616d6504067072696e746e0100067072696e7473010004696e697400056170706c79020130013 1010b4163636f756e744e616d65044e616d6502087472616e736665720 0030466726f6d0b4163636f756e744e616d6502746f0b4163636f756e7 44e616d6506616d6f756e740655496e743634076163636f756e7400020 76163636f756e74044e616d650762616c616e63650655496e743634010 00000b298e982a4087472616e736665720100000080bafac6080369363 401076163636f756e7400076163636f756e74"
} ],
"output": [{ "notify": [],
"deferred_transactions": [] }}]}
...] initt generated block #188249 @ 2018-04-13T22:00:24 with 0 trxs 0 pending
Init World!
Init World!
Init World!
尝试应用此 transaction;
成功并打印出“Init World!”; 失败则回滚所做的变化(也有可能打印“Init World!”后失败)。
Hello World: ${account}->hello
Hello World: ${account}->hello
Hello World: ${account}->hello
用于调试智能合约的主要方法是 Caveman调试法,我们使用打印的方法来
C API 支持打印如下数据类型:
prints - a null terminated char array (string);
prints_l - any char array (string) with given size;
printi - 64-bit unsigned integer;
printi128 - 128-bit unsigned integer;
printd - double encoded as 64-bit unsigned integer;
integer (128-bit unsigned, 64-bit unsigned, 32-bit unsigned, signed, unsigned); base32 string encoded as 64-bit unsigned integer;
struct that has print( ) method。
现在报名,立享200元优惠,赶紧报名吧!👇👇
中科院4大院士齐聚深圳共谈区块链,精华都在这了…… | 现场直击 两个女孩全程不带现金,只付加密货币几乎游遍大半个国家是一种什么体验? 2020年,区块链开发者还有哪些期待? 微软张若非:搜索引擎和广告系统,那些你所不知的AI落地技术 【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了 华为生产不含美国芯片的手机!