Commit f8e5e02a authored by shajiaiming's avatar shajiaiming

跨链优化

parent ee6e91d8
......@@ -32,33 +32,26 @@ class CrossChainController extends BaseController
$data['address'] = $post['address'];
$data['transfer_number'] = date('YmdHis') . self::getrandnums();
$model = CoinCrossChain::find()->where(['address' => $post['address'], 'current_step' => CoinCrossChain::STEP_DEFAULT, 'is_with_draw' => CoinCrossChain::RECHARGE])->one();
if ($model) {
$isExist = CoinCrossChain::find()
->where(['address' => $post['address'], 'is_with_draw' => CoinCrossChain::RECHARGE])
->andWhere(['query_result' => '0'])
->asArray()->all();
if ($isExist) {
$msg = '存在未完成的交易!';
goto doEnd;
}
$model = new CoinCrossChain();
foreach ($post['txs'] as $key => $val) {
if (1 == $val['step']) {
$seq = 'first';
} else if (2 == $val['step']) {
$seq = 'second';
} else {
$seq = 'first';
}
$data['txhex_' . $seq] = $val['tx'];
$data['transfer_url_' . $seq] = $val['url'];
}
$model->setScenario(CoinCrossChain::SCENARIOS_CREATE);
if ($model->load($data, '') && $model->save()) {
$msg = 'success';
$code = 0;
} else {
$msg = current($model->firstErrors);
$model = new CoinCrossChain();
$data['txhex'] = $val['tx'];
$data['transfer_url'] = $val['url'];
$model->load($data, '');
$model->save();
}
$code = 0;
$msg = 'success';
doEnd :
return ['code' => $code, 'msg' => $msg];
}
......@@ -82,37 +75,78 @@ class CrossChainController extends BaseController
goto doEnd;
}
$model = CoinCrossChain::find()->where(['address' => $address, 'is_with_draw' => $is_with_draw])->orderBy("id desc")->limit(1)->asArray()->one();
$model = CoinCrossChain::find()->where(['address' => $address, 'is_with_draw' => $is_with_draw])->orderBy("id desc")->limit(2)->asArray()->all();
if (empty($model)) {
$msg = '数据不存在!';
goto doEnd;
}
if (false == $model['txhash'] && false == $model['msg']) {
$data = [
'step' => $model['current_step']
];
$code = 0;
$msg = '交易尚未执行';
goto doEnd;
}
if (false == $model['txhash'] && false != $model['msg']) {
$data = [
'step' => $model['current_step']
];
$msg = $model['msg'];
goto doEnd;
}
if (true == $model['txhash'] && false == $model['msg']) {
$data = [
'step' => $model['current_step']
];
$code = 0;
$msg = $model['txhash'];
goto doEnd;
sort($model);
$step = 0;
foreach ($model as $key => $val) {
if (0 == $key) {
if (false == $val['send_result'] && false == $val['query_result'] && false == $val['msg']) {
$data = [
'step' => $key
];
$code = 0;
$msg = '第一笔交易尚未执行';
goto doEnd;
}
if (true == $val['send_result'] && false == $val['query_result'] && false == $val['msg']) {
$data = [
'step' => $key + 1
];
$code = 0;
$msg = $val['send_result'];
goto doEnd;
}
if (false == $val['send_result'] && false == $val['query_result'] && true == $val['msg']) {
$data = [
'step' => $key + 1
];
$code = -1;
$msg = $val['msg'];
goto doEnd;
}
if (true == $val['send_result'] && true == $val['query_result'] && false == $val['msg']) {
continue;
}
}
if (1 == $key) {
if (false == $val['send_result'] && false == $val['query_result'] && false == $val['msg']) {
$data = [
'step' => $key + 1
];
$code = 0;
$msg = '第二笔交易尚未执行';
goto doEnd;
}
if (true == $val['send_result'] && false == $val['query_result'] && false == $val['msg']) {
$data = [
'step' => $key + 1
];
$code = 0;
$msg = $val['send_result'];
goto doEnd;
}
if (false == $val['send_result'] && false == $val['query_result'] && true == $val['msg']) {
$data = [
'step' => $key + 1
];
$code = -1;
$msg = $val['msg'];
goto doEnd;
}
if (true == $val['send_result'] && true == $val['query_result'] && false == $val['msg']) {
$data = [
'step' => 3
];
$code = 0;
$msg = $val['send_result'];
goto doEnd;
}
}
}
doEnd :
......
......@@ -7,11 +7,6 @@ use common\core\BaseActiveRecord;
class CoinCrossChain extends BaseActiveRecord
{
const STEP_DEFAULT = 0;
const STEP_FIRST = 1;
const STEP_SECOND = 2;
const STEP_THRID = 3;
const WITHDRAW = 0;
const RECHARGE = 1;
......@@ -22,7 +17,7 @@ class CoinCrossChain extends BaseActiveRecord
public static function tableName()
{
return '{{%coin_cross_chain}}';
return '{{%coin_cross_chain_transfer}}';
}
//定义场景
......@@ -32,7 +27,7 @@ class CoinCrossChain extends BaseActiveRecord
public function rules()
{
return [
[['is_with_draw', 'address', 'txhex_first', 'transfer_url_first', 'txhex_second', 'transfer_url_second'], 'required'],
[['is_with_draw', 'address', 'txhex', 'transfer_url'], 'required'],
['transfer_number', 'safe']
];
}
......@@ -40,7 +35,7 @@ class CoinCrossChain extends BaseActiveRecord
public function scenarios()
{
$scenarios = [
self:: SCENARIOS_CREATE => ['is_with_draw', 'address', 'txhex_first', 'transfer_url_first', 'txhex_second', 'transfer_url_second', 'transfer_number'],
self:: SCENARIOS_CREATE => ['is_with_draw', 'address', 'txhex', 'transfer_url', 'transfer_number'],
];
return array_merge(parent:: scenarios(), $scenarios);
}
......
......@@ -234,6 +234,14 @@ class Chain33Service
return $this->send($params, 'Chain33.SendTransaction');
}
public function QueryTransaction($data)
{
$params = [
'hash' => $data
];
return $this->send($params, 'Chain33.QueryTransaction');
}
public function getBalance($address, $execer)
{
$params = [
......
......@@ -16,7 +16,7 @@ class CrossChainController extends Controller
*/
public function actionAutoTransfer()
{
$model = CoinCrossChain::find()->where(['txhash' => "0"])->limit(20)->asArray()->all();
$model = CoinCrossChain::find()->where(['send_result' => "0"])->limit(20)->groupBy('transfer_number')->orderBy('id')->asArray()->all();
if (empty($model)) {
echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL;
return 0;
......@@ -25,18 +25,7 @@ class CrossChainController extends Controller
foreach ($model as $val) {
// go(function () use ($val) {
// \Co::sleep(0.5);
if (1 == $val['current_step']) {
$seq = 'first';
$step = 1;
} else if (2 == $val['current_step']) {
$seq = 'second';
$step = 2;
} else {
$seq = 'first';
$step = 1;
}
$node_params = $val['transfer_url_' . $seq];
$node_params = $val['transfer_url'];
$node_params = explode(':', $node_params);
$node_params = [
'scheme' => $node_params[0],
......@@ -44,28 +33,66 @@ class CrossChainController extends Controller
'port' => $node_params[2]
];
$service = new Chain33Service($node_params);
$sign_str = $val['txhex_' . $seq];
$sign_str = $val['txhex'];
$result = $service->sendTransaction($sign_str);
if (0 != $result['code']) {
$txhash = '0';
$msg = $result['msg'];
goto doEnd;
}
$txhash = $result['result'];
$msg = 'success';
$step = ($step + 1 > 2) ? 2 : ($step + 1);
$send_result = $result['result'];
doEnd :
$current_step = $step;
$currentModel = CoinCrossChain::findOne($val['id']);
$currentModel->current_step = $current_step;
$currentModel->txhash = $txhash;
$currentModel->msg = $msg;
if (isset($msg)) {
$currentModel->msg = $msg;
}
if (isset($send_result)) {
$currentModel->send_result = $send_result;
}
$currentModel->save();
// });
}
return 0;
}
public function actionQueryTransaction()
{
$model = CoinCrossChain::find()->where(['<>', 'send_result', '0'])->limit(20)->asArray()->all();
if (empty($model)) {
echo date('Y-m-d H:i:s') . '暂无跨链交易计划' . PHP_EOL;
return 0;
}
foreach ($model as $val) {
$node_params = $val['transfer_url'];
$node_params = explode(':', $node_params);
$node_params = [
'scheme' => $node_params[0],
'host' => str_replace('//', '', $node_params[1]),
'port' => $node_params[2]
];
$service = new Chain33Service($node_params);
$send_result = $val['send_result'];
$result = $service->QueryTransaction($send_result);
if (isset($result['result']['actionName']) && 'unknown' == $result['result']['actionName']) {
$query_result = 'success';
$msg = 'success';
} else if (isset($result['result']['receipt']['ty']) && 2 == $result['result']['receipt']['ty']) {
$query_result = 'success';
$msg = 'success';
} else {
$query_result = 'fail';
$msg = $result['result']['receipt']['logs'][0]['log'];
}
$currentModel = CoinCrossChain::findOne($val['id']);
$currentModel->query_result = $query_result;
$currentModel->msg = $msg;
$currentModel->save();
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment