質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Solidity

Solidityは、仮想通貨イーサリアム上で実行できるプログラミング言語。スマートコントラクトやDAppsなどの開発・実装に用いられます。コントラクト指向・高水準な言語のため、イーサリアム上で動作するEVM Codeに翻訳することが可能です。

Ethereum

Ethereum(イーサリアム)は、ビットコインに次いで時価総額が大きい仮想通貨もしくはそのブロックチェーン技術を指します。DApps やスマート・コントラクトの構築を目的としたプラットフォームであり、OSSで開発されています。

Q&A

解決済

1回答

335閲覧

solidityでクラウドファンディングのコントラクトを書いていますが、上手く行きません。

CTO-Michael

総合スコア7

Solidity

Solidityは、仮想通貨イーサリアム上で実行できるプログラミング言語。スマートコントラクトやDAppsなどの開発・実装に用いられます。コントラクト指向・高水準な言語のため、イーサリアム上で動作するEVM Codeに翻訳することが可能です。

Ethereum

Ethereum(イーサリアム)は、ビットコインに次いで時価総額が大きい仮想通貨もしくはそのブロックチェーン技術を指します。DApps やスマート・コントラクトの構築を目的としたプラットフォームであり、OSSで開発されています。

0グッド

0クリップ

投稿2018/05/07 05:33

前提・実現したいこと

solidityを用いてクラウドファンディングを行うコントラクトを作っています。
「最低投資額を設定し、それに満たない投資額は弾く。目標額と現在の総額の差が最低額より小さい場合は差額と同じ投資額のみ受け付ける」という条件を付与したいのですが、上手く行きません。アドバイス頂きたいです。

発生している問題・エラーメッセージ

目標額に達し、締切の時間になっても、fundingと表示され、クラウドファンディングが終わらない。
最低投資額以下の金額でも通ってしまう。

該当のソースコード

solidity

1pragma solidity ^0.4.11; 2contract CrowdFunding { 3 // 投資家 4 struct Investor { 5 address addr; // 投資家のアドレス 6 uint amount; // 投資額 7 } 8 9 address public owner; // コントラクトのオーナー 10 uint public numInvestors; // 投資家の数 11 uint public deadline; // 締め切り(UnixTime) 12 string public status; // キャンペーンのステータス 13 bool public ended; // キャンペーンが終了しているかどうか 14 uint public goalAmount; // 目標額 15 uint public totalAmount; // 投資の総額 16 uint public minAmount; //最低投資額の設定 17 uint public difference; //目標額と現在の金額の差 18 mapping (uint => Investor) public investors; // 投資家管理用のマップ 19 20 modifier onlyOwner () { 21 require(msg.sender == owner); 22 _; 23 } 24 25 /// コンストラクタ 26 function CrowdFunding(uint _duration, uint _goalAmount, uint _minAmount) public { 27 owner = msg.sender; 28 29 // 締め切りをUnixTimeで設定 30 deadline = now + _duration; 31 32 goalAmount = _goalAmount; 33 status = "Funding"; 34 ended = false; 35 36 numInvestors = 0; 37 totalAmount = 0; 38 } 39 40 /// 投資する際に呼び出される関数 41 function fund() public payable { 42 // キャンペーンが終わっていれば処理を中断する 43 require(!ended); 44 45 Investor storage inv = investors[numInvestors++]; 46 inv.addr = msg.sender; 47 inv.amount = msg.value; 48 totalAmount += inv.amount; 49 } 50 51 /// 目標額に達したかを確認する 52 /// また、キャンペーンの成功/失敗に応じたetherの送金を行う 53 function checkGoalReached() public onlyOwner { 54 // キャンペーンが終わっていれば処理を中断する 55 require(!ended); 56 57 // 締め切り前の場合は処理を中断する 58 require(now >= deadline); 59 60 if(totalAmount >= goalAmount) { // キャンペーンに成功した場合 61 status = "Campaign Succeeded"; 62 ended = true; 63 // オーナーにコントラクト内のすべてのetherを送金する 64 if(!owner.send(this.balance)) { 65 revert(); 66 } 67 } else { // キャンペーンに失敗した場合 68 uint i = 0; 69 status = "Campaign Failed"; 70 ended = true; 71 72 // 投資家毎にetherを返金する 73 while(i <= numInvestors) { 74 if(!investors[i].addr.send(investors[i].amount)) { 75 revert(); 76 } 77 i++; 78 } 79 } 80 } 81 82 ///最低投資額に満たない投資を弾く関数 83 //目標額と現在額の差が最低投資額より小さかった場合はその金額のみ許可 84 function setMinAmount() public payable { 85 difference = goalAmount - totalAmount; 86 if(difference >= minAmount) { 87 require(msg.value < minAmount); 88 } 89 else { 90 require(msg.value != difference); 91 } 92 } 93 94 /// コントラクトを破棄するための関数 95 function kill() public onlyOwner { 96 selfdestruct(owner); 97 } 98} 99

試したこと

set.minAmountのpayableを消してみたり、コントラクタ内にminAmountの定義を試みたりしました。

補足情報(FW/ツールのバージョンなど)

mist wallet上でデプロイしてます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

setMinAmount()fund()から呼ばれていないので、fund()時に条件成就のチェックが行われていません。

投稿2018/05/07 05:40

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CTO-Michael

2018/05/09 08:56

ありがとうございます。fund()関数の中で条件分岐を行う様にしたら上手くいきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問